Android 如何在使用kotlin进行数据库调用之前呈现视图

Android 如何在使用kotlin进行数据库调用之前呈现视图,android,kotlin,koin,Android,Kotlin,Koin,我对koin有一个奇怪的问题(可能?我以前没有过这个问题) 我使用的是Flow(从dao到视图模型)和LiveData(从视图模型到片段)的组合 我的存储库如下所示: fun getPets(): Flow<Status> = flow { emit(Status.LOADING) SystemClock.sleep(5000) emit(Status.PETS(petsDao.getPets())) } priva

我对koin有一个奇怪的问题(可能?我以前没有过这个问题)

我使用的是
Flow
(从dao到视图模型)和
LiveData
(从视图模型到片段)的组合

我的存储库如下所示:

fun getPets(): Flow<Status> = flow { 
    
    emit(Status.LOADING)
    
    SystemClock.sleep(5000)
    
    emit(Status.PETS(petsDao.getPets()))
    
}
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
        }
 
    })
观察如下数据:

fun getPets(): Flow<Status> = flow { 
    
    emit(Status.LOADING)
    
    SystemClock.sleep(5000)
    
    emit(Status.PETS(petsDao.getPets()))
    
}
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()
            )
        }
问题是,当我启动应用程序时,我获得了状态。正在加载,但没有任何视图

当状态更改为Staus.PETS时,我将获得PETS数据和视图

这就好像视图模型太快了,在我有机会膨胀视图之前,它就调用了存储库(我记录了生命周期,它确实在恢复之前调用)


如何修复代码?

在我看来,与其使用sleep(blocking method),后者只会阻止执行,不如使用自定义回调

  • 要检查视图是否已膨胀,请尝试查找一个视图如果返回null则该视图尚未膨胀,否则它已膨胀
  • findViewById(您的视图id)

  • 如果<代码>视图!=空然后执行回调,如所示
  • 我也遇到过类似的问题,自定义回调就是解决方案。如果您在自定义回调方面需要任何进一步的帮助,请让我知道我将更新我的答案,并提供一个实际示例