如何解决如何在片段中使用ViewModel?
我正在使用MVVM体系结构。我有一个活动和一些片段,我想在活动中的API中提出一个请求,然后使用ViewModel,这要感谢获得的数据,以便将它们显示在片段中。我应该怎么做?我当前无法使用的解决方案:
活动:
viewModelRoutesFragment = new ViewModelProvider(this).get(ViewModelRoutesFragment.class);
viewModelRoutesFragment.init();
片段:
viewModelRoutesFragment = new ViewModelProvider(this).get(ViewModelRoutesFragment.class);
viewModelRoutesFragment.getRoutes().observe(getActivity(),new Observer<List<RoutesResponse>>() {
@Override
public void onChanged(List<RoutesResponse> routes) {
//Show data
}
});
存储库:
public class RemoteRepository {
private ApiRequest apiRequest;
private MutableLiveData<List<RoutesResponse>> routes = new MutableLiveData<>();
public RemoteRepository() {
apiRequest = RetrofitRequest.getInstance().create(ApiRequest.class);
}
public MutableLiveData<List<RoutesResponse>> getRoutes() {
apiRequest.getRoutes()
.enqueue(new Callback<List<RoutesResponse>>() {
@Override
public void onResponse(Call<List<RoutesResponse>> call,Response<List<RoutesResponse>> response) {
if (response.isSuccessful())
routes.setValue(response.body());
}
@Override
public void onFailure(Call<List<RoutesResponse>> call,Throwable t) {
Log.i("Failure","Fail!");
}
});
return routes;
}
}
ViewModel:
public class ViewModelRoutesFragment extends AndroidViewModel {
private RemoteRepository remoteRepository;
private LiveData<List<RoutesResponse>> routes;
public ViewModelRoutesFragment(@NonNull Application application) {
super(application);
}
public void init() {
remoteRepository = new RemoteRepository();
routes = remoteRepository.getRoutes();
}
public LiveData<List<RoutesResponse>> getRoutes() {
return routes;
}
}
当前出现空错误。如何正确避免呢?
java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.lifecycle.LiveData.observe(androidx.lifecycle.LifecycleOwner,androidx.lifecycle.Observer)' on a null object reference
解决方法
在片段中
使用viewModelRoutesFragment = new ViewModelProvider(requireActivity()).get(ViewModelRoutesFragment.class);
而不是'viewModelRoutesFragment = new ViewModelProvider(this).get(ViewModelRoutesFragment.class);'
您在活动中不需要视图模型参考。您应该在活动中具有片段实例。您的片段已经包含对ViewModel的引用。从活动->中删除这些行:
viewModelRoutesFragment = new ViewModelProvider(this).get(ViewModelRoutesFragment.class);
viewModelRoutesFragment.init();
确保在活动中初始化片段。您的活动只是一个holder块,它实际上使用片段管理器替换了片段。如果要在其中使用片段,它确实需要任何视图模型。
此外,请在片段viewModelRoutesFragment.init();
中调用此方法
在此行下方
viewModelRoutesFragment = new ViewModelProvider(this).get(ViewModelRoutesFragment.class);
,
基本上,我们正在尝试在活动和片段之间共享视图模型。 所以在活动创建期间,我们必须创建viewmodel实例
viewModelRoutesFragment = new ViewModelProvider(requireActivity()).get(ViewModelRoutesFragment.class);
viewModelRoutesFragment.init();
在片段中,我们还需要重用ViewModelRoutesFragment,因此在onViewCreated()中 获取ViewModel的实例并观察实时数据
viewModelRoutesFragment = new ViewModelProvider(requireActivity()).get(ViewModelRoutesFragment.class);
viewModelRoutesFragment.getRoutes().observe(getActivity(),new Observer<List<RoutesResponse>>() {
@Override
public void onChanged(List<RoutesResponse> routes) {
// updation of UI
}
});
,
您可以使用SharedViewModel
SharedViewModel stepViewModel = ViewModelProviders.of(this).get("step",SharedViewModel.class);
stepViewModel.init;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。