Dagger2:注入RxJava2函数

我一直在关注Hannes Dorfman的MVI教程 ,他提到通过Dagger注入一个函数让代码看起来类似于下面的代码:

注入function:

@Provides @Singleton fun providesModelFunc( searchEngine: SearchEngine): Function1<Observable, Observable> = { stringObservable -> stringObservable.startWith("").flatMap { queryString -> searchEngine.search(queryString) } } 

函数( modelFunc )在类中使用:

 subscription = modelFunc( // model() view.searchIntent() // intent() ) .observeOn(AndroidSchedulers.mainThread()) .subscribe( // view() view.showData(), view.showError() ) 

我一直在试图实现一个类似的东西,但不是在Kotlin,到目前为止在Module的function建设罚款:

 @Provides @Singleton Function<Observable, Observable> providesSearchFunction(DiscogsInteractor discogsInteractor) { return searchViewQueryTextEventObservable -> searchViewQueryTextEventObservable.flatMap(queryString -> { if (queryString.toString().equals("")) return Observable.just(""); else return discogsInteractor.searchDiscogs(queryString.toString()); }); } 

但是,在我的Presenter使用该function会造成一些麻烦。 它注入罚款:

 private Function<Observable, Observable> searchModelFunc; @Inject public SearchPresenter(SearchContract.View mView, DiscogsInteractor discogsInteractor, Function<Observable, Observable> searchModelFunc) { this.mView = mView; mInteractor = discogsInteractor; this.searchModelFunc = searchModelFunc; } 

但是因为Kotlin的语法有点不同,所以我正在努力将其应用于我的意图。 我不能用

searchModelFunc(mView.searchIntent())

因为这不是Android语法。 所以我已经解决了

mView.searchIntent().map(searchModelFunc);

这里的问题是我的function没有被正确的格式拾取: 在这里输入图像说明

在深入学习Kotlin之前,什么是正确的语法?

我认为明白地注入function不是要走的路。 考虑注入一个函数访问器对象:

 interface ModelFunctions { Function, Observable> search(); } 

这样,如果需要,您将能够为演示者提供进一步的function。 此外,它将使代码更具可读性。

 interface ModelFunctions { Function, Observable> search(); Function, Observable> anotherSearch(); } 

我改变了注射

 @Provides @Singleton Function> providesSearchFunction(DiscogsInteractor discogsInteractor) { return searchViewQueryTextEvent -> discogsInteractor.searchDiscogs(searchViewQueryTextEvent.queryText().toString()); } 

然后它可以使用像:

 mView.searchIntent() .flatMap(searchModelFunc)