gpt4 book ai didi

android - Android-等待在ViewModel中初始化变量以在Fragment中进行

转载 作者:行者123 更新时间:2023-12-02 13:36:02 25 4
gpt4 key购买 nike

我正在使用Kotlin协程从Room数据库中获取数据,并且我需要等待在ViewModel中初始化变量才能在Fragment中使用它们,主要是为了初始化GoogleMap之类的其他功能,但也出于其他目的(例如检查导航条件等)。
另外,我实际上需要等待Navigation中的Args,因此第一个调用是从Fragment到ViewModel,然后才触发协同程序

我已经看到了多种实现方法,但是我对Android还是很陌生,没有一种与我已经使用的方法相匹配的,而且大多数情况下它太复杂了,我听不懂。

实际上我在Fragment中使用了它:

Handler().postDelayed(
{My code...}, 50)

但是我知道这根本不是一个干净的方法,有时变量甚至在50ms之后都没有初始化。我也尝试过一个简单的
While (var == null){}
My code...

但这也很野蛮,只会冻结应用程序。

这是我的片段的一个例子
var currentSession: Session? = null

val args = SessionDetailsFragmentArgs.fromBundle(arguments!!)
viewModel.initializeSession(args.sessionID)

viewModel.session.observe(this, Observer{
currentSession = it
})
//I need to wait for currentSession to continue
..Doing stuff with currentSession..

这是我的ViewModel:
private var _session = MutableLiveData<Session?>()
val session: LiveData<Session?>
get() = _session

fun initializeSession(key: Long) {
uiScope.launch {
_session.value = withContext(Dispatchers.IO) {
val session = dataSessionSource.getSession(key)
session
}
}

}


我将其缩短了一点,但更多地了解我的工作方式。一切都可以根据需要进行编译和工作

我需要的是一个函数 MyVariable.OnInitialized() { ... },仅当 MyVariable已初始化时才启动代码

最佳答案

我不知道这是否是您所需要的,但是也许可以使用加载在ui中显示,直到满足您的需求为止。

在您的 View 模型中,您可以这样:

private val _loading = MutableLiveData<Boolean>().apply(value = false)
val loading: LiveData<Boolean>
get() = _loading

然后,在启动 session 时将load的值更改为true,在 session 结束时将其的值更改为false。您只需要观察片段中的负载并将其显示给用户即可。

关于android - Android-等待在ViewModel中初始化变量以在Fragment中进行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57038950/

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