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
这样,如果需要,您将能够为演示者提供进一步的function。 此外,它将使代码更具可读性。
interface ModelFunctions { Function, Observable
我改变了注射
@Provides @Singleton Function> providesSearchFunction(DiscogsInteractor discogsInteractor) { return searchViewQueryTextEvent -> discogsInteractor.searchDiscogs(searchViewQueryTextEvent.queryText().toString()); }
然后它可以使用像:
mView.searchIntent() .flatMap(searchModelFunc)