Moxy
Moxy copied to clipboard
Use Moxy together with AndroidInjection
Hi, I use AndroidInjection. I know how inject into MvpAppCompatActivity: But I don't know how inject into Presenter.
public class App extends Application implements HasActivityInjector {
@Inject
DispatchingAndroidInjector<Activity> dispatchingAndroidInjector;
@Override
public void onCreate() {
super.onCreate();
DaggerAppComponent
.builder()
.context(this)
.build()
.inject(this);
}
@Override
public AndroidInjector<Activity> activityInjector() {
return dispatchingAndroidInjector;
}
}
@Singleton
@Component(modules = {AppModule.class,RestModule.class})
public interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
Builder context(Context context);
AppComponent build();
}
void inject(App app);
}
@Module(includes = {AndroidSupportInjectionModule.class})
public interface AppModule {
@ActivityScope
@ContributesAndroidInjector(modules = {MainActivityModule.class,NavigationModule.class})
MainActivity mainActivityInjector();
}
@Module
public interface MainActivityModule {
@ActivityScope
NavigateManager provideNavigateManager();
@FragmentScope
@ContributesAndroidInjector()
StartFragment myFragment();
}
abstract public class BaseActivity extends MvpAppCompatActivity implements HasSupportFragmentInjector {
@Inject
Router router;
@Inject
NavigatorHolder navigatorHolder;
@Inject
DispatchingAndroidInjector<Fragment> fragmentInjector;
@Inject
NavigateManager mNavigateManager;
@BindView(R.id.toolbar)
Toolbar mToolbar;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
AndroidInjection.inject(this);
super.onCreate(savedInstanceState);
setSupportActionBar(mToolbar);
if (savedInstanceState == null) {
mNavigateManager.getNavigator().applyCommands(new Command[]{new Replace(START_ACTION, 1)});
}
}
public Router getRouter() {
return router;
}
@Override
protected void onResumeFragments() {
super.onResumeFragments();
navigatorHolder.setNavigator(mNavigateManager.getNavigator());
}
@Override
protected void onPause() {
super.onPause();
navigatorHolder.removeNavigator();
}
@Override
public AndroidInjector<Fragment> supportFragmentInjector() {
return fragmentInjector;
}
}
@InjectViewState
public class ContractorsPresenter extends BaseFeedPresenter<BaseFeedView> {
@Inject
ContractorsGetApi mGetApi;
@Override
Single<BaseFeedViewModel<BaseViewModel>> onLoadViewModelObservableTest() {
return Observable.range(1, 100)
.map(integer -> {
ContractorMod contractorMod = new ContractorMod();
contractorMod.code = integer.toString();
contractorMod.name = "name " + integer;
return contractorMod;
})
.map(contractorMod -> new ContractorItemViewModel(contractorMod))
.reduce(new ArrayList<>(), (list, item) -> {
list.add(item);
return list;
})
.map(contractorItemViewModels -> {
BaseFeedViewModel baseFeedViewModel = new BaseFeedViewModel();
baseFeedViewModel.setViewModelList(contractorItemViewModels);
return baseFeedViewModel;
});
}
@Override
public Single<BaseFeedViewModel<BaseViewModel>> onCreateLoadDataObservable(int count, int offset, String filterName) {
return mGetApi.getData(new ContractorsGetRqMod(offset, count, filterName).toMap(),
AuthManager.getAuthStr())
.map(contractorsGetRsModBaseRsMod -> contractorsGetRsModBaseRsMod.response)
.map(contractorsGetRsMod -> transformModelBaseFeedViewModel(contractorsGetRsMod));
}
BaseFeedViewModel<BaseViewModel> transformModelBaseFeedViewModel(ContractorsGetRsMod contractorsGetRsMod){
BaseFeedViewModel<BaseViewModel> baseFeedViewModel = new BaseFeedViewModel();
List<ContractorMod> list = contractorsGetRsMod.getContractors();
List<BaseViewModel> litConItemVM = new ArrayList<>();
for (ContractorMod item : list) {
litConItemVM.add(new ContractorItemViewModel(item));
}
baseFeedViewModel.setViewModelList(litConItemVM);
return baseFeedViewModel;
}
}
Hi, try to use constructor Injection for presenters
Do you have example? Please. I can't find any example.
I will user pseudo code in Kotlin to explain:
class LoginPresenter @Inject constructor(
private val loginRepository: LoginRepository
) : MvpPresenter<LoginView>() {
fun doLogin() {
if (loginRepository.login) {
viewState.onLogin()
} else {
viewState.onError()
}
}
}
interface LoginView : MvpView {
@StateStrategyType(SkipStrategy::class)
fun onLogin()
@StateStrategyType(SkipStrategy::class)
fun onError()
}
class LoginActivity : MvpDaggerAppCompatActivity(), LoginView {
@Inject
internal lateinit var lazyPresenter: Lazy<LoginPresenter>
@InjectPresenter
internal lateinit var presenter: LoginPresenter
@ProvidePresenter
fun providePresenter(): LoginPresenter = lazyPresenter.get()
}
@Module
abstract class LoginModule {
@Binds
abstract fun bindMainPresenter(presenter: LoginPresenter): MvpPresenter<LoginView>
}