Dagger2:注入RxJava2函数

时间:2017-04-04 15:43:44

标签: android

我一直关注Hannes Dorfman's MVI tutorial,他提到通过Dagger注入一个函数来使代码看起来类似于下面的代码:

注入功能:

@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()
        )

我一直在尝试实现类似的东西,但在Kotlin中却没有,到目前为止,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

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

2 个答案:

答案 0 :(得分:1)

我认为明白注入这个功能并非如此。考虑注入一个函数访问器对象:

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

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

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

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

答案 1 :(得分:0)

我将注射更改为

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

然后它可以像:

一样使用
mView.searchIntent()
                .flatMap(searchModelFunc)