Android Dagger2,演示器中的接口
我正在学习dager2。至于我,我还不清楚界面和演示者之间的关系。例如,我有一个没有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")
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知道如何提供演示者的其余依赖项,您可以使用一个模块简化上述内容。摆脱用户模块,支持用户视图模块