无法解析片段中的 ViewModelProvider 构造?

Lea*_*oid 15 android android-mvvm android-livedata android-architecture-components

我花了很多时间试图弄清楚为什么在下面的代码中(接近结尾),我在 ViewModelProvider(this) 上遇到错误。我也试过 getActivity() 而不是 'this',同样的问题。我得到的错误是“无法解析构造函数......”


import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProvider;



public class ItemSetupFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_setup, container, false);

        return view;
    }

    @Override
    public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        ItemSetupFragmentModel model = new ViewModelProvider(this).get(ItemSetupFragmentModel.class);
        model.getKids().observe(this, users -> {
            // update UI
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

显示 Android Studio 中编译错误的图像

Sha*_*rim 43

首先,您需要使用最新版本的生命周期扩展。它应该是:

implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
implementation "androidx.lifecycle:lifecycle-viewmodel:2.2.0" 
Run Code Online (Sandbox Code Playgroud)

或任何更新版本。

那么你应该使用requireActivity()而不是getActivity(). 通过这种方式,您将确保活动被附加并且不会获得NullPointerException.

ItemSetupFragmentModel model = new ViewModelProvider(requireActivity()).get(ItemSetupFragmentModel.class);
Run Code Online (Sandbox Code Playgroud)

注意: ViewModel 概述声明依赖

将库添加到 Gradle 文件后,我不得不重新启动缓存。没必要用requireActivity()this就够了。


Som*_*mar 7

您没有使用ViewModelProvider(@NonNull ViewModelStoreOwner owner)包含构造函数的最新库版本。您正在查看最新的文档,但未使用ViewModel. 你需要使用

    implementation 'androidx.lifecycle:lifecycle-viewmodel:2.2.0' // For Java
Run Code Online (Sandbox Code Playgroud)

或者

    implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0' // For kotlin extension
Run Code Online (Sandbox Code Playgroud)