Android Dagger2,演示器中的接口

Android Dagger2,演示器中的接口,android,dagger,Android,Dagger,我正在学习dager2。至于我,我还不清楚界面和演示者之间的关系。例如,我有一个没有dagger2的项目 MainActivity <- acitivty MainView <- interface MainPresenter <- class 我的演讲者 MainPresenter{ public void MainPresenter(MainView mainView) {///} public void getData() {mainView.test("test")

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

MainActivity <- acitivty
MainView <- interface
MainPresenter <- class
我的演讲者

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

public void getData() {mainView.test("test")}
}
class UserPresenter(private val userHelper: UserHelper, private val generalHelpers: GeneralHelpers) {

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

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

    }

}
我的界面

inreface MainView  {
public void test(String test)
}
---------------------------------------------------------- 对我来说,一切都很清楚。当我使用dagger2时,我有这样一个代码:

    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()}")
        }

    }
界面用户视图

interface UserView {
    fun setData(data: String)
}
对于一个测试,我创建了两个模块

@Module
class HelpersModule {

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

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

}

我还有一个应用程序组件

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

    // activities
    fun inject(activity: MainActivity)
}
我的演讲者

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

public void getData() {mainView.test("test")}
}
class UserPresenter(private val userHelper: UserHelper, private val generalHelpers: GeneralHelpers) {

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

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

    }

}
我的活动

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()}")
   }
}
在活动中调用onCreate()

presenter.userView = this

选项2

您必须创建另一个模块,最好是一个接口或抽象类,以便包含在您的UserModule中。Dagger不知道如何提供UserView,因此我们需要指导DI如何操作。 更改为演示者的构造函数:

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()}")
   }
}
我认为,如果Dagger知道如何提供演示者的其余依赖项,您可以使用一个模块简化上述内容。摆脱用户模块,支持用户视图模块