首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Dagger2:注入RxJava2函数

Dagger2:注入RxJava2函数
EN

Stack Overflow用户
提问于 2017-04-04 15:43:43
回答 2查看 123关注 0票数 0

我一直在跟踪汉尼斯·多夫曼的MVI教程,他提到通过Dagger注入一个函数,以使代码看起来类似于下面的代码:

注入功能:

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

类中使用的函数(modelFunc):

代码语言:javascript
复制
subscription =
    modelFunc(  // model()
            view.searchIntent()  // intent()
        )
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe( // view()
            view.showData(),
            view.showError()
        )

我一直在尝试实现类似的东西,但没有在Kotlin中实现,到目前为止,函数构建是在Module fine中实现的:

代码语言:javascript
复制
@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中使用这个函数会带来一些麻烦。它注射精细:

代码语言:javascript
复制
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);

这里的问题是,我的函数没有以正确的格式获得:

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-04 17:23:16

我把注射改为

代码语言:javascript
复制
@Provides
@Singleton
Function<SearchViewQueryTextEvent, ObservableSource<?>> providesSearchFunction(DiscogsInteractor discogsInteractor)
{
    return searchViewQueryTextEvent -> discogsInteractor.searchDiscogs(searchViewQueryTextEvent.queryText().toString());
}

然后它就可以像:

代码语言:javascript
复制
mView.searchIntent()
                .flatMap(searchModelFunc)
票数 0
EN

Stack Overflow用户

发布于 2017-04-05 17:27:05

我认为,明确地注入这种功能并不是一条道路。考虑注入一个函数访问器对象:

代码语言:javascript
复制
interface ModelFunctions {
    Function<Observable<SearchViewQueryTextEvent>, Observable<Object>> search();
}

这样,如果需要的话,您可以为推荐人提供更多的功能。此外,它将使代码更具可读性。

代码语言:javascript
复制
interface ModelFunctions {
    Function<Observable<SearchViewQueryTextEvent>, Observable<Object>> search();

    Function<Observable<SearchViewQueryTextEvent>, Observable<Object>> anotherSearch();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43211865

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档