有人帮我指出为什么我的代码不起作用。我想弄明白,但我找不到问题 我尝试注入演示者,但我收到了错误:
lateinit property appComponent has not been initialized
似乎演示者没有注射 的AppModule
@Module
class AppModule {
@Provides @Singleton
fun provideMainPresenter(): MainActivityContract.Presenter = MainActivityPresenter()
}
AppComponent
@Singleton
@Component(modules = arrayOf(AppModule::class))
interface AppComponent {
fun inject(target: MainActivity)
}
应用
class App: Application() {
companion object {
lateinit var appComponent: AppComponent
}
override fun onCreate() {
super.onCreate()
appComponent = initDagger()
}
fun initDagger() = DaggerAppComponent.create()
}
这是我希望将演示者注入
的MainActivityclass MainActivity : AppCompatActivity(), MainActivityContract.View, AnkoLogger {
@Inject
lateinit var presenter: MainActivityContract.Presenter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
App.appComponent.inject(this)
presenter.attachView(this)
}
}
这是MainActivityPresenter,它实现了MainActivityContract.Presenter
class MainActivityPresenter: MainActivityContract.Presenter {
var view: MainActivityContract.View? = null
override fun attachView(view: MainActivityContract.View) {
this.view = view
}
override fun detachView() {
view = null
}
override fun performToast(text: String) {
}
}
修改:我自己设法解决了这个问题: 对于所有的android初学者和我一样。当我们声明App扩展应用程序时。我们必须在清单中声明它
<application
android:name=".App"
/>
答案 0 :(得分:1)
在MainActivity中,您可以替换代码:
@Inject
lateinit var presenter: MainActivityContract.Presenter
代表
@field:[Inject]
lateinit var presenter: MainActivityContract.Presenter
答案 1 :(得分:0)
您无法将静态变量定义为lateinit
,并期望onCreate()
对其进行初始化。尝试这样的事情:
class GlobalApplication : Application() {
companion object {
lateinit var globalApp: GlobalApplication
}
internal var mApplicationComponent: ApplicationComponent? = null
get
override fun onCreate() {
super.onCreate()
globalApp = this
//Init Timber
if (BuildConfig.DEBUG) {
Timber.plant(Timber.DebugTree())
}
//Init application component
mApplicationComponent = DaggerApplicationComponent.builder()
.applicationModule(ApplicationModule(this))
.build()
mApplicationComponent?.inject(this)
//Ignore URI exposure
val builder = StrictMode.VmPolicy.Builder()
StrictMode.setVmPolicy(builder.build())
}
}