java - 如何在 fragment 中使用 ViewModel?

标签 java android android-fragments mvvm android-livedata

我正在使用 MVVM 架构。我有一个 Activity 和几个 fragment ,我想在 Activity 中的API中发出请求,然后使用ViewModel,感谢获得的数据,将它们显示在 fragment 中。我该怎么做?我当前不起作用的解决方案:
Activity :

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;
    }
}
View 模型:
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

最佳答案

基本上,我们试图在 Activity 和 fragment 之间共享 View 模型。
所以在 Activity 创建期间,我们必须创建 View 模型的实例

viewModelRoutesFragment = new ViewModelProvider(requireActivity()).get(ViewModelRoutesFragment.class);
viewModelRoutesFragment.init();
在 fragment 中,我们还需要在 onViewCreated() 中重用 ViewModelRoutesFragment
获取 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
    }
});

关于java - 如何在 fragment 中使用 ViewModel?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63548323/

相关文章:

android - Firebase 数据库 IllegalStateException : Fragment not attached to Activity

java - 在kafka中消费批处理时如何部分提交同步

java - 如何根据使用的字体将代码点映射到 unicode 字符?

java - Google Places API photo_reference

java - 如何使用 Hibernate/JPA 将 Oracle 类型对象转换为 Java 对象?

android - 无法将请求的类放入单个 dex 文件中,即使对于之前编译良好的早期提交也是如此

android - 在 SQLite 表中使用文本作为主键不好?

Android 通知不会堆叠

android - 设置应用程序 :layout_behavior programmatically

Android 从后台恢复给我空白 fragment