为什么我的 Android ViewModel 不能持久化数据?
Why my Android ViewModel cannot persistent data?
我正在使用 Jetpack Compose 进行编程。
我从网络请求数据并将其保存到 Composable 中的 ViewModel,
但是当我想在其他 Composable 中使用数据时,ViewModel returns null
// ViewModel:
class PartViewModel : ViewModel() {
private val mPicRepository: PicRepository = PicRepository()
private val _partsResult: MutableLiveData<PicResp> = MutableLiveData()
val partsResilt: LiveData<PicResp> get() = _partsResult
fun getPartsFromImage(id: Long) {
mPicRepository.getCloudPic(id, _partsResult)
}
}
// Composable which request data
@Composable
fun PagePhotoDetail(imageId: Long, navController: NavHostController) {
val vm: PartViewModel = viewModel()
vm.getPartsFromImage(imageId)
partsState.value?.data?.let {
Logger.d(it.parts) // this log show correct data
}
}
// Composable which use data
@Composable
fun PagePartListFromImage(navController: NavHostController) {
val vm: PartViewModel = viewModel()
Logger.d(vm.partsResilt.value) // this log cannot get data and show null
}
您正在创建视图模型的两个不同实例。您需要像 val vm by viewmodels<PartViewModel>
这样初始化视图模型
然后将此视图模型作为参数传递到可组合项中。大功告成!
好吧,如果您仍然希望在可组合项中初始化它,您可以使用 val vm by viewmodel<PartViewModel>
。
viewModel<>
而不是 viewModels<>
我正在使用 Jetpack Compose 进行编程。
我从网络请求数据并将其保存到 Composable 中的 ViewModel,
但是当我想在其他 Composable 中使用数据时,ViewModel returns null
// ViewModel:
class PartViewModel : ViewModel() {
private val mPicRepository: PicRepository = PicRepository()
private val _partsResult: MutableLiveData<PicResp> = MutableLiveData()
val partsResilt: LiveData<PicResp> get() = _partsResult
fun getPartsFromImage(id: Long) {
mPicRepository.getCloudPic(id, _partsResult)
}
}
// Composable which request data
@Composable
fun PagePhotoDetail(imageId: Long, navController: NavHostController) {
val vm: PartViewModel = viewModel()
vm.getPartsFromImage(imageId)
partsState.value?.data?.let {
Logger.d(it.parts) // this log show correct data
}
}
// Composable which use data
@Composable
fun PagePartListFromImage(navController: NavHostController) {
val vm: PartViewModel = viewModel()
Logger.d(vm.partsResilt.value) // this log cannot get data and show null
}
您正在创建视图模型的两个不同实例。您需要像 val vm by viewmodels<PartViewModel>
然后将此视图模型作为参数传递到可组合项中。大功告成!
好吧,如果您仍然希望在可组合项中初始化它,您可以使用 val vm by viewmodel<PartViewModel>
。
viewModel<>
而不是 viewModels<>