问题描述
我对koin有一个奇怪的问题(可能是?以前没有这个问题)。
我正在使用Flow
(从dao到视图模型)和LiveData
(从视图模型到片段)的组合
我的存储库如下:
fun getPets(): Flow<Status> = flow {
emit(Status.LOADING)
SystemClock.sleep(5000)
emit(Status.PETS(petsDao.getPets()))
}
在片段中,我将使用Koin
实例化我的视图模型,如下所示:
private val petsviewmodel: Petsviewmodel by viewmodel()
并观察这样的数据:
petsviewmodel.status.observe(viewLifecycleOwner,Observer {status ->
if (status == LOADING) {
uiListener.displayProgressBar(true)
} else if(status == PETS) {
//Show pets data
}
})
Koin视图模型设置:
viewmodel {
Petsviewmodel(
petsRepository = get(),context = androidContext()
)
}
问题是,当我启动该应用程序时,我正在获取Status.Loading,但没有任何视图。
当状态更改为Staus.PETS时,我正在获取宠物数据和视图。
就像视图模型太快了一样,它甚至在我没有机会膨胀视图之前就调用了存储库(我记录了生命周期,并且确实在onResume之前调用了)
如何修复我的代码?
解决方法
我认为,您应该使用自定义回调
,而不是使用sleep(blocking方法)而不是仅仅执行阻止工作的工作(blocking方法)- 要检查视图是否已膨胀,请尝试查找返回null的视图,则该视图尚未膨胀,否则已膨胀
findViewById(your_view_id)
- 如果
view != null
,则像this一样执行回调。
我遇到过类似的问题,自定义回调是解决方案。如果您需要有关自定义回调的其他帮助,请告诉我,我将更新答案并提供一个实际示例。