Dagger2,演示器中的界面

Dagger2, interface in presenter

我正在学习 dager2。至于我,我还不清楚界面和演示者的时刻。例如我有一个没有 dagger2 的项目。

MainActivity <- acitivty
MainView <- interface
MainPresenter <- class

我在MainActivity中实现了接口MainView

MainActivity implements MainView {

   onCreate(///) {
       MainPresener mP = new MainPresenter(this)
        mp.getData() 
   }        

   @overirde // method from interface
    public void test(String test) {///}
}

我的主持人

MainPresenter{
public void MainPresenter(MainView mainView) {///}

public void getData() {mainView.test("test")}
}

我的界面

inreface MainView  {
public void test(String test)
}

-------------------------------------------- --------------

所以,对我来说,一切都很清楚。当我使用 dagger2 时,我有这样的代码:

界面用户视图

interface UserView {
    fun setData(data: String)
}

为了测试我创建了两个模块

@Module
class HelpersModule {

    @Provides
    fun provideUserHelper(): UserHelper {
        return UserHelper()
    }

    @Provides
    fun provideGeneralHelper(): GeneralHelpers {
        return GeneralHelpers()
    }

}

@Module
class UserModule {

    @Provides
    fun provideUserPresenter(userHelper: UserHelper,
                             generalHelpers: GeneralHelpers): UserPresenter {
        return UserPresenter(userHelper, generalHelpers)
    }

我还有 AppComponent

@Component(modules = arrayOf(UserModule::class, HelpersModule::class))
@Singleton
interface AppComponent {
    // inject to ...

    // activities
    fun inject(activity: MainActivity)
}

我的主持人

class UserPresenter(private val userHelper: UserHelper, private val generalHelpers: GeneralHelpers) {

    private  val TAG: String = UserPresenter::class.java.simpleName

    fun getUser() {
        Log.e(TAG, "getUser")

    }

}

我的activity

class MainActivity : AppCompatActivity(), UserView {

    private var TAG: String = "MainActivity"

    @Inject
    lateinit var userPresenter: UserPresenter

    override fun onCreate(savedInstanceState: Bundle?) {
        // init app component, this activity
        App.appComponent.inject(activity = this@MainActivity)
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }

    override fun onResume() {
        super.onResume()
        userPresenter.getUser()
    }

    override fun setData(data: String) {
        Log.e(TAG, "data from presenter $data")
    }

}

我的问题: 我如何从 UserPresenter 中的 UserView 接口调用方法,如下所示:

    class UserPresenter(private val userHelper: UserHelper, private val generalHelpers: GeneralHelpers) {

        private  val TAG: String = UserPresenter::class.java.simpleName

        fun getUser() {
            Log.e(TAG, "getUser")
// call method from interface UserView, and display data in MainActivity
            userView.setData("Alex, ${userHelper.getDefAge()} ${generalHelpers.generalHelper()}")
        }

    }

您必须通过使用 DI 框架或手动设置视图将您的视图注入演示器。

选项 1

class UserPresenter(private val userHelper: UserHelper, private val generalHelpers: GeneralHelpers) {
   private val TAG: String = UserPresenter::class.java.simpleName
   lateinit var userView: UserView 

   fun getUser() {
      Log.e(TAG, "getUser")
      userView.setData("Alex, ${userHelper.getDefAge()} ${generalHelpers.generalHelper()}")
   }
}

在您的 Activity

中调用 onCreate()
presenter.userView = this

选项 2

您必须创建另一个模块,最好是一个接口或抽象 class 到 UserModule 中的 include。 Dagger 不知道如何提供 UserView,所以我们需要指导 DI how-to。 更改为 Presenter 的构造函数:

class UserPresenter(private val userHelper: UserHelper, private val generalHelpers: GeneralHelpers, private va userView: UserView ) {
   private val TAG: String = UserPresenter::class.java.simpleName

   fun getUser() {
      Log.e(TAG, "getUser")
      userView.setData("Alex, ${userHelper.getDefAge()} ${generalHelpers.generalHelper()}")
   }
}
@Module
abstract class UserViewModule {
   @Binds
   abstract fun bindUserView(activity: MainActivity): UserView
}

...
// in your UserModule
@Module(includes = [UserViewModule::class])
class UserModule { 
...
}

如果 Dagger 知道如何提供演示者的其余依赖项,我认为您可以使用一个模块来简化上述操作。摆脱 UserModule 以支持 UserViewModule。