Dagger2,演示者中的接口

问题描述 投票:0回答:1

我正在学习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()}")
        }

    }
android dagger
1个回答
0
投票

您将必须通过使用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

您将必须创建另一个模块,最好是UserModuleinclude的接口或抽象类。 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。

© www.soinside.com 2019 - 2024. All rights reserved.