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。
我正在学习 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。