Moxy icon indicating copy to clipboard operation
Moxy copied to clipboard

Use Moxy together with AndroidInjection

Open zavbak opened this issue 6 years ago • 3 comments

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;
    }

}


zavbak avatar May 19 '18 01:05 zavbak

Hi, try to use constructor Injection for presenters

xanderblinov avatar May 21 '18 16:05 xanderblinov

Do you have example? Please. I can't find any example.

zavbak avatar May 21 '18 22:05 zavbak

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>

}

ahulyk avatar Jun 15 '18 08:06 ahulyk