VIPER Инъектор Интерактор в Presenter - PullRequest
0 голосов
/ 09 июля 2019

У меня есть приложение с архитектурой VIPER. Я использую DI с dagger-2, но не могу ввести интерактор в презентатор.

Я получаю следующую ошибку:

lateinit property interactor has not been initialized

У меня есть следующий код:

MainView (Kotlin)

interface MainView {

    interface View : BaseView {
        showMessage(message : String)
    }

    interface InteractorOutput{
        ...
    }
}

MainActivity (Kotlin)

class MainActivity : BaseActivity(), MainView.View {

    @Inject lateinit var presenter: MainPresenter

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.main)
    }

    override fun onCreatePresenter() {
        presenter.setView(this)
        presenter.onCreate()
    }

    override fun initializeDagger() {
        activityComponent.inject(this)
    }

    override fun showMessage(message : String){
        Toast(...)
    }
}

MainPresenter (Kotlin)

class MainPresenter @Inject constructor(): BasePresenter<MainView.View, MainInteractor>(), MainView.InteractorOutput {

    @Inject lateinit var interactor : MainInteractor

    override fun onCreate() {
        interactor.doSomething()
    }
}

MainInteractor (Kotlin)

class MainInteractor: BaseInteractor() {

    fun doSomething() {
        Log.e("Hello ", "World!")
    }
}

ActivityComponent (Java)

@PerActivity
@Component(dependencies = ApplicationComponent.class, modules = ActivityModule.class})
public interface ActivityComponent {
    void inject(MainActivity mainActivity);
}

ActivityModule (Java)

@Module
public class ActivityModule {

    private final BaseActivity mActivity;

    public ActivityModule(BaseActivity activity) {
       mActivity = activity;
    }

    @Provides
    @PerActivity
    BaseActivity activity() {
        return mActivity;
    }

    @Provides
    @PerActivity
    MainPresenter provideMainPresenter() {
        return new MainPresenter();
    }
}

ApplicationComponent (Java)

@Singleton
@Component(modules = {ApplicationModule.class})
public interface ApplicationComponent {

    void inject(BaseActivity baseActivity);

}

ApplicationModule (Java)

@Module
public class ApplicationModule {

    private final BaseApplication mApplication;

    public ApplicationModule(BaseApplication application) {
        mApplication = application;
    }

    @Provides
    @Singleton
    Context provideApplicationContext() {
        return mApplication;
    }
}

1 Ответ

1 голос
/ 09 июля 2019

В настоящее время ваш интерактор настроен как поле для ввода. Однако нет механизма для ввода этого поля, и на самом деле в этом нет необходимости, поскольку вместо этого следует использовать конструктор.

Удалите из своей презентации следующее:

@Inject lateinit var interactor: MainInteractor

и вместо этого внедрить его в конструктор:

class MainPresenter @Inject constructor(private val interactor: MainInteractor)

Также в настоящее время Dagger не может предоставить MainInteractor, поэтому вам нужно аннотировать его конструктор с помощью:

class MainInteractor: BaseInteractor @Inject constructor () {

Мне неясно, в чем разница между MainPresenter и MainActivityPresenter, и у вас могут возникнуть дальнейшие проблемы. Эти изменения должны приблизить вас.

...