我怎么能用匕首将对象注入android kotlin MVP mosby应用程序中的演示者

时间:2017-09-01 12:49:50

标签: android kotlin mvp dagger mosby

我正在努力让匕首在我的申请中工作。 创建模块组件和MyApp后,我可以使用匕首将数据库服务注入视图,但我在使用演示者做同样的事情时遇到了麻烦。 代码:

[HttpPost]
[Route("PostLeaveRequest")]
public async Task<IActionResult> PostLeaveRequest([FromBody] LeaveRequest leaveRequest)
{
 ..................................

}

模块

class MyApp : Application() {

    var daoComponent: DaoComponent? = null
    private set

    override fun onCreate() {
        super.onCreate()

        daoComponent = DaggerDaoComponent.builder()
            .appModule(AppModule(this)) // This also corresponds to the name of your module: %component_name%Module
            .daoModule(DaoModule())
            .build()
    }
}

组件

@Module
class DaoModule {
    @Provides
    fun providesEstateService(): EstateService = EstateServiceImpl()
}

的AppModule

@Singleton
@Component(modules = arrayOf(AppModule::class, DaoModule::class))
interface DaoComponent {
    fun inject(activity: MainActivity)
}

MainActivity

@Module
class AppModule(internal var mApplication: Application) {

    @Provides
    @Singleton
    internal fun providesApplication(): Application {
        return mApplication
    }
}

以这种方式注入estateService之后我可以使用它,但我无法弄清楚如何将服务直接注入到演示者中。 我试过这样做,但它不起作用。 我应该只从活动中传递注入的对象吗?或者我可以将MyApp作为参数传递或者使用静态方法允许我从应用程序的任何位置获取它?

class MainActivity : MvpActivity<MainView, MainPresenter>(), MainView {
    @Inject
    lateinit var estateService : EstateService

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        (application as MyApp).daoComponent!!.inject(this)estateService.numberOfInvoicedEstates.toString()
    }

    override fun createPresenter(): MainPresenter = MainPresenterImpl()
}

3 个答案:

答案 0 :(得分:1)

您的组件应该像这样提供演示者:

@Component(modules = arrayOf(AppModule::class, DaoModule::class))
@Singleton
interface MyComponent {
   mainPresenter() : MainPresenter
}

演示者需要的所有依赖项都通过构造函数参数注入到演示者中:

class MainPresenterImpl 
    @Inject constructor(private val estateService : EstateService ) :
    MvpBasePresenter<MainView>(),MainPresenter {
   ...
}

createPresenter()中,只需从dagger组件中抓取演示者,如下所示:

class MainActivity : MvpActivity<MainView, MainPresenter>(), MainView {

    ...

    override fun createPresenter(): MainPresenter =  
       (application as MyApp).myComponent().mainPresenter()
}

请注意,上面显示的代码无法编译。这只是伪代码,可以让您了解依赖图在Dagger中的外观。

答案 1 :(得分:0)

请参阅this示例,了解如何将Dagger 2与MVP结合使用。

答案 2 :(得分:0)

您必须告诉您的组件要注射它的位置。

所以,试试这个组件:

@Singleton
@Component(modules = arrayOf(AppModule::class, DaoModule::class))
interface DaoComponent {
    fun inject(presenter: MainPresenterImpl)
}