Tôi đang theo mẫu MVVM - có nghĩa là tôi có ViewModel cho mỗi Fragment.
Tôi đã thêm hai tab bằng cách sử dụng ViewPager2.
Bộ điều hợp của tôi trông như thế này:
@Override
public Fragment createFragment(int position) {
switch (position) {
case 0:
return new MergedItemsFragment();
case 1:
return new ValidatedMergedItemsFragment();
}
return new MergedItemsFragment();
}
Các tab đang hoạt động. Tuy nhiên, tôi nhận thấy rằng ViewModel của MergedItemsFragment của tôi đang hoạt động kỳ lạ. Trước khi tôi thêm các tab, tôi đã điều hướng đến Fragment như thế này:
NavHostFragment.findNavController(this).navigate(R.id.action_roomFragment_to_itemsFragment);
Khi tôi để lại đoạn NavHostFragment.findNavController(this).popBackStack()
đó và sau đó trở lại đoạn đó, tôi sẽ nhận được một ViewModel trống mới. Điều này đã được dự định.
Với cách tiếp cận mới, tôi đang điều hướng return new MergedItemsFragment()
. Khi tôi rời khỏi đoạn đó và sau đó trở về, tôi nhận được một ViewModel chứa dữ liệu cũ . Đó là một vấn đề vì dữ liệu cũ không còn phù hợp nữa vì Người dùng đã chọn dữ liệu khác nhau trong một đoạn khác.
Cập nhật số 1
Tôi nhận ra rằng anh ta thực sự giữ tất cả các Mảnh vỡ cũ trong bộ nhớ vì các câu lệnh in giống nhau được gọi nhiều lần. Số lần nó được gọi là tăng theo số lần tôi rời khỏi và quay lại màn hình đó. Vì vậy, nếu tôi rời đi và quay lại 10 lần và xoay thiết bị của mình, anh ta thực sự sẽ thực hiện một dòng 10 lần. Bạn có đoán được cách triển khai Tab / ViewPager với Thành phần điều hướng theo cách hoạt động với ViewModels không?
Cập nhật số 2
Tôi đặt ViewModels của mình như thế này:
viewModel = new ViewModelProvider(this, providerFactory).get(MergedItemViewModel.class)
Tôi nhận được kết quả tương tự với:
viewModel = ViewModelProviders.of(this).get(MergedItemViewModel.class);
Tôi liên kết ViewModel trong Fragment. Do đó, this
là mảnh vỡ.