我正在学习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时,我有这样的代码:
界面UserView
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")
}
}
我的活动
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中include的接口或抽象类。 Dagger不知道如何提供UserView,因此我们需要指导DI如何操作。
@Module
abstract class UserViewModule {
@Binds
abstract fun bindUserView(activity: MainActivity): UserView
}
...
// in your UserModule
@Module(includes = [UserViewModule::class])
class UserModule {
...
}
我认为,如果Dagger知道如何提供演示者的其余依赖关系,则您可以使用一个模块来简化上述操作。摆脱UserModule的支持,而使用UserViewModule。