如何实现ViewModelProvider.Factory?

问题描述 投票:0回答:1

我想在我的 Fragment 的 onViewCreated 方法中访问 ViewModel 类(它扩展了 AndroidViewModel)。下面的代码行应该像 android 文档 所说的那样工作。但事实并非如此!

ProductListViewModel viewModel = new ViewModelProvider(this).get(ProductListViewModel.class);

显然,ViewModelProvider 构造函数最近已更改。它需要一个 ViewModelProvider.Factory 实现作为第二个参数。为什么需要 ViewModelProvider.Factory 实现,应该怎么做?

这是我的片段类:

public class HomeFragment extends Fragment {

    private HomeListAdapter homeListAdapter;

    public HomeFragment() {
        // Required empty public constructor
    }

    public static HomeFragment newInstance() {
        return new HomeFragment();
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }

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

        homeListAdapter = new HomeListAdapter(getContext());

        RecyclerView homeRecyclerView = view.findViewById(R.id.rv_products);
        homeRecyclerView.setAdapter(homeListAdapter);
        homeRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));

        return view;
    }

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

        ProductListViewModel viewModel = new ViewModelProvider(this).get(ProductListViewModel.class);

        viewModel.getAllProducts().observe(this, new Observer<List<Product>>() {
            @Override
            public void onChanged(List<Product> products) {
                homeListAdapter.setProducts(products);
            }
        });
    }
}

这是我的 ViewModel:

public class ProductListViewModel extends AndroidViewModel {

    private ProductRepository mRepository;
    private LiveData<List<Product>> mAllProducts;

    public ProductListViewModel(@NonNull Application application) {
        super(application);

        mRepository = new ProductRepository(application);
        mAllProducts = mRepository.getAllProducts();
    }

    public LiveData<List<Product>> getAllProducts() {
        return mAllProducts;
    }

    public void insert(Product product) {
        mRepository.insert(product);
    }
}
java android viewmodel android-architecture-components android-jetpack
1个回答
0
投票

因为 ViewModelProvider 不知道 ViewModel 是如何注入构造函数的。

你必须实现接口

ViewModelProvider.AndroidViewModelFactory

在科特林中:

class MyAndroidViewModel(application: Application) : AndroidViewModel(application)

class MyViewModelFactory(application: Application) :
    ViewModelProvider.AndroidViewModelFactory(application)

class MyActivity : Activity() {
    val viewModel = MyViewModelFactory(this.application).create(MyAndroidViewModel::class.java)
}

AndroidViewModel 提供应用程序上下文,这对 单元测试。单元测试不应处理任何 Android 生命周期,例如上下文。

© www.soinside.com 2019 - 2024. All rights reserved.