我一直关注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);
在我深入学习Kotlin之前,正确的语法是什么?
答案 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)