我一直在跟踪汉尼斯·多夫曼的MVI教程,他提到通过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 fine中实现的:
@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);
这里的问题是,我的函数没有以正确的格式获得:

在深入学习Kotlin之前,正确的语法是什么?
发布于 2017-04-04 17:23:16
我把注射改为
@Provides
@Singleton
Function<SearchViewQueryTextEvent, ObservableSource<?>> providesSearchFunction(DiscogsInteractor discogsInteractor)
{
return searchViewQueryTextEvent -> discogsInteractor.searchDiscogs(searchViewQueryTextEvent.queryText().toString());
}然后它就可以像:
mView.searchIntent()
.flatMap(searchModelFunc)发布于 2017-04-05 17:27:05
我认为,明确地注入这种功能并不是一条道路。考虑注入一个函数访问器对象:
interface ModelFunctions {
Function<Observable<SearchViewQueryTextEvent>, Observable<Object>> search();
}这样,如果需要的话,您可以为推荐人提供更多的功能。此外,它将使代码更具可读性。
interface ModelFunctions {
Function<Observable<SearchViewQueryTextEvent>, Observable<Object>> search();
Function<Observable<SearchViewQueryTextEvent>, Observable<Object>> anotherSearch();
}https://stackoverflow.com/questions/43211865
复制相似问题