片段在重新创建视图后从 ViewModel 丢失数据
Fragment lose data from ViewModel after recreating view
假设您有 2 个片段连接到一个(或多个)viewModel,并且在 activity 内部您将在它们之间切换。打开片段后,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 种状态:运行、Success、Error,并且取决于这些状态,视图正在更新。因此,在第一个片段打开时,视图更新两次,这会导致跳帧和显示闪烁。
我正在考虑将数据保存在片段中,但我想避免数据重复。除此之外,在 sharedViewModel 的情况下,您会遇到有关更新片段内部数据的问题!
请帮帮我!
从 onViewCreated(View view, Bundle savedInstanceState)
观察您的数据可能会奏效。
假设您有 2 个片段连接到一个(或多个)viewModel,并且在 activity 内部您将在它们之间切换。打开片段后,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 种状态:运行、Success、Error,并且取决于这些状态,视图正在更新。因此,在第一个片段打开时,视图更新两次,这会导致跳帧和显示闪烁。
我正在考虑将数据保存在片段中,但我想避免数据重复。除此之外,在 sharedViewModel 的情况下,您会遇到有关更新片段内部数据的问题!
请帮帮我!
从 onViewCreated(View view, Bundle savedInstanceState)
观察您的数据可能会奏效。