2017-09-24 92 views
1

我是一个Android的新手,并试图使用Dagger2。我花了整晚,仍然不知道为什么我的匕首不提供主持人。这里是我的代码(我用的科特林)Dagger2没有注入

AppComponent

@Singleton 
@Component(modules = arrayOf(PresenterModule::class)) 
interface AppComponent { 

    fun inject(target: SplashActivity) 

} 

PresenterModule

@Module 
class PresenterModule { 

    @Provides 
    @Singleton 
    fun provideSplashPresenter(): SplashPresenter { 
     return SplashPresenter() 
    } 
} 

应用

class App: Application() { 

    companion object { 
     lateinit var appComponent: AppComponent 
    } 

    override fun onCreate() { 
     super.onCreate() 
     appComponent = initDagger() 
    } 

    private fun initDagger(): AppComponent { 
     return DaggerAppComponent.create() 
    } 
} 

这是主持人

class SplashPresenter: BasePresenterImpl<SplashContract.View>(), SplashContract.Presenter { 

    override fun performToast(mess: String) { 
     logi("abc", "performToast") 
     logi("abc", "mess: " + mess) 
     mView?.showLoading() 
     if (mess.isNullOrBlank()) { 
      mView?.showTosat("this is empty mess") ?: logi("abc", "null") 
     } else { 
      mView?.showTosat(mess) ?: logi("abc", "null") 
     } 
     mView?.hideLoading() 

    } 
} 

最后,这是我SplashActivity

class SplashActivity : BaseActivity(), SplashContract.View { 


    @Inject 
    lateinit var presenter: SplashPresenter 

    override fun onCreate(savedInstanceState: Bundle?) { 
     super.onCreate(savedInstanceState) 
     setContentView(R.layout.activity_splash) 

     presenter.attachView(this) 

     //TODO: check log in 
     //TODO: If logged in => start main screen 
     //TODO: If not logged in => load login activity 

     button.setOnClickListener{ 
      presenter.performToast(editText.text.toString()) 
      logi("abc", "perform clicked") 
     } 
    } 
} 

当我运行这些代码,我得到这个错误 Lateinit财产主持人尚未初始化,这意味着“注入”不起作用

回答

2

由于你在这里没有使用构造器注入(你不能,因为你不'拥有'该活动的构造函数)Dagger并不知道它必须注入一些东西到你的Activity。 你有这样的手动注入:

(applicationContext as App).appComponent.inject(this) 

SplashActivityonCreate()方法(当然使用的主持人,之前)。

其次,你的主持人需要一个构造函数,告诉匕首如何构建/“建设”的演讲,这意味着与@Inject注解的构造,所以:

class SplashPresenter @Inject constructor(): BasePresenterImpl<SplashContract.View>(), SplashContract.Presenter 
1

你忘了注入SplashActivity:

override fun onCreate(savedInstanceState: Bundle?) { 
    super.onCreate(savedInstanceState) 
    App.appComponent.inject(this) 
    setContentView(R.layout.activity_splash) 
    ...