我正在使用视图模型上的 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())
当您使用
FarmViewModel
在不同屏幕中注入 viewModel()
时,实际上您注入了该 ViewModel
的不同实例,每个实例的作用域为自己的屏幕。不同的实例显然不会知道彼此字段的值。
可以在导航目的地之间共享
ViewModel
,但建议每个屏幕有一个 ViewModel
类,例如FarmViewModel
代表 FarmScreen
,FarmsViewModel
代表 FarmsScreen
。
您可以使用
导航参数将农场 ID 传递给
FarmScreen
并在 FarmViewModel
创建时获取数据。