【问题标题】:Fragment lose data from ViewModel after recreating view重新创建视图后,片段从 ViewModel 中丢失数据
【发布时间】:2020-05-22 05:57:54
【问题描述】:

假设您有 2 个片段连接到一个(或多个)视图模型,并且在活动内部您将在它们之间切换。打开片段后,viewModel 会按预期工作,因此我开始监听 onCreate 方法的更改,代码示例:

 viewModel =  new ViewModelProvider(requireActivity(), new InventoryTasksFactory()).get(InventoryTasksViewModel.class);
    viewModel.inventoryTasksResponse().observe(this, new Observer<Response<List<InventoryTask>>>() {
        @Override
        public void onChanged(Response<List<InventoryTask>> listResponse) {
            handleResponse(listResponse);
        }
    });

但是当您切换到另一个片段并返回时,片段变为空白。我了解 viewModel 内部的片段监听发生了变化,您应该手动从 viewModel 获取值,我从 onCreateView 方法内部的 viewModel 获取值,代码示例:

 Response<List<InventoryTask>> inventory = viewModel.inventoryTasksResponse().getValue();
    if (inventory!=null){
        handleResponse(inventory);
    }

问题是 Response 有 3 个状态:正在运行、成功、错误,并且取决于这些状态视图正在更新。因此,在第一个片段打开时,视图更新两次,这会导致跳帧和显示闪烁。

我正在考虑将数据保存在片段中,但我想避免数据重复。除此之外,在 sharedViewModel 的情况下,您会遇到更新片段内部数据的问题!

请帮帮我!

【问题讨论】:

  • “视图更新两次”你能解释一下吗?你使用片段交易对吗?
  • 感谢您的提问!是的,与动画的交易。我现在得到的是 Response.Running 和 Response.Success 变成了一堆响应,当视图创建时,视图更新为正在运行,然后更新为成功,这会导致跳帧。所以,我唯一能做的就是延迟从 repo 获取数据的过程。

标签: android mvvm android-databinding android-livedata


【解决方案1】:

onViewCreated(View view, Bundle savedInstanceState) 观察您的数据可能会奏效。

【讨论】:

  • 祝你好运:D 前段时间我也遇到过同样的问题,如果我的大脑没有把它弄乱,这就是它的帮助。
  • 感谢帮助)) 测试成功,代码变得更加简洁,无需检查 livedata 值的可空性))
  • 很高兴我能帮助@JohnyDeph :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-21
相关资源
最近更新 更多