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

问题描述

我对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方法)
  1. 要检查视图是否已膨胀,请尝试查找返回null的视图,则该视图尚未膨胀,否则已膨胀

findViewById(your_view_id)

  1. 如果view != null,则像this一样执行回调。

我遇到过类似的问题,自定义回调是解决方案。如果您需要有关自定义回调的其他帮助,请告诉我,我将更新答案并提供一个实际示例。