【发布时间】:2021-03-30 03:55:01
【问题描述】:
Android Architechture Compnents 建议使用 ViewModel、LiveData、Room、Repository quadology 从本地数据库中获取数据。 正如Android Developers 和许多其他资源所描述的那样,我正在遵循路径:
数据库 -> Room (Dao) -> Repository -> ViewModel (AndroidViewModel) -> LiveData Observers
正如它所说,Repository 需要向数据库提供应用程序级别的上下文,这就是我们使用 AndroidViewModel 类来创建 Repository 的原因。 AndroidViewModel 在其构造函数中需要 Application 对象。
现在在 Fragments 中,每当我使用 getActivity().getApplication() 时,Android Studio 都会警告我 getActivity() 可能会返回 null 并生成 NullPointerException。
我搜索了 Stackflow 并尝试了 requireActivity().getApplication()。有效。开发人员说总是在 onActivityCreated() 肉食中使用它。我注意到它仅适用于由 Activity 创建的那些片段。它不适用于在另一个 Fragment 中创建的那些 Fragment。他们从不接听onActivityCreated() 电话。
现在我不知道如何从此类访问 AndroidViewModel 对象。希望有人明白这里的问题是什么。请帮忙。
这是 BranchDetailsViewModel 类:
public class BranchDetailsViewModel extends AndroidViewModel {
final BranchRepository branchRepository;
final BankRepository bankRepository;
final CityRepository cityRepository;
final DistrictRepository districtRepository;
final StateRepository stateRepository;
LiveData<Branch> branch;
public BranchDetailsViewModel(Application application) {
super(application);
branchRepository = new BranchRepository(application);
bankRepository = new BankRepository(application);
cityRepository = new CityRepository(application);
districtRepository = new DistrictRepository(application);
stateRepository = new StateRepository(application);
}
}
这是另一个 Fragment 的子 BranchDetailsFragment。目前我正在从 Activity 创建的顶级片段中传递 Application 对象以使事情正常进行。:
public class BranchDetailsFragment extends Fragment {
private final Application application;
private final int branchIid;
private FragBranchDetailsBinding binding;
public BranchDetailsFragment(Application application, int branchIid) {
this.application = application;
this.branchIid = branchIid;
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
binding = FragBranchDetailsBinding.inflate(inflater, container, false);
return binding.getRoot();
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
BranchDetailsViewModel branchDetailsViewModel = new BranchDetailsViewModel(application);
}
}
【问题讨论】:
-
您不需要在 Fragment 中传递应用程序对象,您已经在传递的 @NonNull 视图视图中的 onViewCreated() 方法中拥有它,该视图始终不为空,因此您可以执行类似的操作即:Application application = (Application)view.getContext().getApplicationContext();
标签: android android-fragments android-viewmodel