【问题标题】:Why my Android ViewModel cannot persistent data?为什么我的 Android ViewModel 不能持久化数据?
【发布时间】:2021-08-06 07:05:02
【问题描述】:

我正在使用 Jetpack Compose 进行编程。
我从网络请求数据并将其保存到可组合的 ViewModel 中,
但是当我想使用其他 Composable 中的数据时,ViewModel 返回 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
}

【问题讨论】:

  • 因为不是同一个 ViewModel 实例。

标签: android android-jetpack-compose android-viewmodel


【解决方案1】:

您正在创建视图模型的两个不同实例。您需要像 val vm by viewmodels&lt;PartViewModel&gt; 一样初始化视图模型

然后将此视图模型作为参数传递给 Composable。大功告成!

好吧,如果你仍然希望在 Composable 中初始化它,你可以使用val vm by viewmodel&lt;PartViewModel&gt;。

viewModel&lt;&gt; 而不是viewModels&lt;&gt;

【讨论】:

  • 它在@Composable 之外工作,但我怎样才能在@composable 中获得相同的效果?
  • 请检查编辑后的答案,忘记之前的cmets
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-13
  • 1970-01-01
  • 2014-04-17
  • 2011-05-08
相关资源
最近更新 更多