【发布时间】:2019-01-24 13:36:14
【问题描述】:
我尝试学习如何使用 Dagger 2。请帮助解决以下异常:
例外: UninitializedPropertyAccessException:lateinit 属性行程没有 已初始化
MainActivityViewModel:
class MainActivityViewModel : ViewModel() {
private lateinit var tripsLiveData: MutableLiveData<List<Trip>>
@Inject
lateinit var trips : List<Trip>
fun getTrips() : LiveData<List<Trip>> {
if (!::tripsLiveData.isInitialized){
tripsLiveData = MutableLiveData()
tripsLiveData.value = trips
}
return tripsLiveData
}
}
旅行模块:
@Module
class TripModule{
@Provides
fun provideTrips(): List<Trip> {
var list = ArrayList<Trip>()
list.add(Trip(100,10))
list.add(Trip(200,20))
return list
}
}
应用组件:
@Singleton
@Component(modules = [
AndroidSupportInjectionModule::class,
ActivityBuilder::class,
TripModule::class])
interface AppComponent{
@Component.Builder
interface Builder {
@BindsInstance
fun application(application: Application): Builder
fun build(): AppComponent
}
fun inject(app: MyApplication)
}
主活动:
class MainActivity : AppCompatActivity() {
@Inject
lateinit var tripsAdapter: TripsAdapter
override fun onCreate(savedInstanceState: Bundle?) {
// Inject external dependencies
AndroidInjection.inject(this)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
setupRecyclerView();
setUpViewModel();
}
private fun setupRecyclerView() {
recycler_view.apply {
layoutManager = LinearLayoutManager(context)
adapter = tripsAdapter
}
}
private fun setUpViewModel(){
val model = ViewModelProviders.of(this).get(MainActivityViewModel::class.java)
model.getTrips().observe(this, Observer { tripsAdapter.trips = it!! })
}
}
【问题讨论】:
-
AndroidInjection.inject(this)应该在super调用之前完成 -
知道了。但是如何修复异常?
-
我不确定它是否适用于 dagger2,除非您将
MainActivityViewModel添加为依赖关系图的叶子。我会改用构造函数注入(使用自定义 ViewModelProvider 工厂) -
能否将 ActivityBuilder 文件中的代码添加到问题中?
-
正如@Blackbelt 所说,必须将 MainActivityViewModel 添加到依赖关系图中,