2017-04-04 61 views
0

我一直在下面Hannes Dorfman's MVI tutorial和他提到通过注射匕首函数来获取代码,类似于下面的:Dagger2:注射RxJava2功能

注入功能:

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

功能(modelFunc )在课堂上使用:

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

我一直在尝试实施类似的事情,但没有在科特林和迄今有功能建设在Module罚款:

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

然而,使用功能在我Presenter会引起一些麻烦。它注入好:

private Function<Observable<SearchViewQueryTextEvent>, Observable<Object>> searchModelFunc; 

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

但是,由于Kotlin语法有点不同,我努力将其应用于我的意图。我不能使用

searchModelFunc(mView.searchIntent())

因为这不是Android的语法。所以,我已经定居

mView.searchIntent().map(searchModelFunc);

这里的问题是,我的功能没有被拾起以正确的格式: enter image description here

之前,我深入学习科特林,什么是正确的语法?

回答

0

我改变了注射

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

然后它可以用于像:

mView.searchIntent() 
       .flatMap(searchModelFunc) 
1

我想清楚地注入功能不是要走的路。考虑注入功能访问器对象:

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

这样,如果需要,您将能够向演示者提供更多功能。此外,它会使代码更具可读性。

interface ModelFunctions { 
    Function<Observable<SearchViewQueryTextEvent>, Observable<Object>> search(); 

    Function<Observable<SearchViewQueryTextEvent>, Observable<Object>> anotherSearch(); 
}