gpt4 book ai didi

android - Dagger2 + Kotlin : lateinit property has not been initialized

转载 作者:IT老高 更新时间:2023-10-28 13:35:43 27 4
gpt4 key购买 nike

我正在尝试将 ViewModelFactory 注入(inject)到我的 Activity 中,但它一直抛出同样的错误:lateinit 属性 viewModelFactory 尚未初始化。我找不到我可能做错了什么。从我的类(class)中查看上面的代码

AppComponent.kt

@Component(modules = [(AppModule::class), (NetworkModule::class), (MainModule::class)])
interface AppComponent {

fun inject(application: TweetSentimentsApplication)

fun inject(mainActivity: MainActivity)

fun context(): Context

fun retrofit(): Retrofit
}

MainModule.kt

@Module
class MainModule {

@Provides
fun mainViewModelFactorty(repository: TweetRepository): MainViewModelFactory = MainViewModelFactory(repository)

@Provides
fun local(database: AppDatabase): TweetLocal = TweetLocal(database)

@Provides
fun remote(tweetService: TweetService): TweetRemote = TweetRemote(tweetService)

@Provides
fun tweetService(retrofit: Retrofit): TweetService = retrofit.create(TweetService::class.java)

@Provides
fun repository(local: TweetLocal, remote: TweetRemote): TweetRepository = TweetRepository(local, remote)

}

MainActivity.kt

class MainActivity : AppCompatActivity() {

@Inject lateinit var viewModelFactory: MainViewModelFactory

private val viewModel: MainViewModel? = null

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

ViewModelProviders.of(this, viewModelFactory).get(MainViewModel::class.java)

viewModel?.init("guuilp")
viewModel?.getTweetList()?.observe(this, Observer {
Toast.makeText(this, it?.size.toString(), Toast.LENGTH_LONG).show()
})
}
}

TweetSentimentsApplication.kt

open class TweetSentimentsApplication: Application(){

companion object {
lateinit var appComponent: AppComponent
}

override fun onCreate() {
super.onCreate()

initDI()
}

private fun initDI() {
appComponent = DaggerAppComponent.builder()
.appModule(AppModule(this))
.build()
}
}

最佳答案

您必须在初始化 MainActivity 时调用您在 AppComponent 中定义的 inject(mainActivity: MainActivity) 方法,这就是 Dagger 实际注入(inject)您需要的依赖项的方式。

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

// This is where the dependencies are injected
TweetSentimentsApplication.appComponent.inject(this)

ViewModelProviders.of(this, viewModelFactory).get(MainViewModel::class.java)

...
}

关于android - Dagger2 + Kotlin : lateinit property has not been initialized,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50554654/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com