Jetpack 在 ViewModel 上为变量编写 Null 值

问题描述 投票:0回答:1

我正在使用视图模型上的 LiveData 设置变量的值。数据是从 Firebase 获取的。 下面是ViewModel结构 类 FarmViewModel(): ViewModel() {

var firestoreDB = InitializeFirestore()
private var _farms = MutableStateFlow<List<FarmEntity>>(emptyList())
private var _farm = MutableLiveData<FarmEntity>()

var farms = _farms.asStateFlow()
var farm : LiveData<FarmEntity> = _farm

init{
   getFarms()
}




fun getFarm(id:String){

    firestoreDB.collection("farms")
        .whereEqualTo("id",id)
        .get()
        .addOnSuccessListener {
            if (it != null) {
                //the farm name value is as expected
                Log.d("farms", "DocumentSnapshot data: ${it.toObjects<FarmEntity>()[0].farm_name}")

                _farm.value=it.toObjects<FarmEntity>()[0]
            } else {
                Log.d("farms", "No such document")
            }
        }
        .addOnFailureListener{
            Log.e("farms",it.message.toString())
            setError(
                ErrorData(
                    code=500,
                    service="CreateFarm",
                    message = it.message.toString()
                )
            )

        }
}

使用 Onclick 事件调用 getFarm 函数,该事件获取所选 ID 并导航到农场屏幕。

在可组合项上,农场值为 Null

val farm = farmViewModel.farm.observeAsState()

Log.i("farm_", farm.value.toString())
android kotlin android-jetpack-compose android-jetpack
1个回答
0
投票

当您使用

FarmViewModel
在不同屏幕中注入
viewModel()
时,实际上您注入了该
ViewModel
的不同实例,每个实例的作用域为自己的屏幕。不同的实例显然不会知道彼此字段的值。

可以在导航目的地之间共享

ViewModel
,但建议每个屏幕有一个
ViewModel
类,例如
FarmViewModel
代表
FarmScreen
FarmsViewModel
代表
FarmsScreen

您可以使用

导航参数
将农场 ID 传递给 FarmScreen 并在
FarmViewModel
创建时获取数据。

© www.soinside.com 2019 - 2024. All rights reserved.