android - 如何在 Android 中实现 ViewModel 工厂

标签 android mvvm factory-pattern android-mvvm

我正在使用 ViewModel 实现 Room 数据库。一切正常。但要求是我想使用 AndroidViewModelFactoryViewModel 提供一些依赖。我能够创建实现 ViewModelProvider.FactoryViewModelFactory 类。我将普通字符串作为对 ViewModel 的依赖项进行传递。工厂类的代码是

public class TestViewModelFactory  implements ViewModelProvider.Factory{
    private static final String DEFAULT_LIMIT = "4";
    static Application application;
    static String created="ViewModelFactorySuccess";

    public static TestViewModelFactory createFactory(Activity activity) {
        application = activity.getApplication();
        if (application == null) {
            throw new IllegalStateException("Not yet attached to Application");
        }
        return new TestViewModelFactory(application, created);
    }
    public TestViewModelFactory(Application application, String created) {
        application=application;
        created=created;

    }
    @NonNull
    @Override
    public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
        try {
            return modelClass.getConstructor(TestViewModel.class, int.class)
                    .newInstance(application, created);
        } catch (NoSuchMethodException | IllegalAccessException |
                InstantiationException | InvocationTargetException e) {
            throw new RuntimeException("Cannot create an instance of " + modelClass, e);
        }
    }
}  

MainActivity 中,ViewModel 的普通实例创建为

TestViewModel testViewModel=new ViewModelProvider.AndroidViewModelFactory(getApplication()).create(TestViewModel.class);  

工作正常。但是如何创建 ViewModel 工厂类的实例,以便可以向 ViewModel 提供依赖项。请建议创建 ViewModel 实例的正确方法。任何帮助将不胜感激。

最佳答案

通用示例(最高为 android.arch.lifecycle:extensions:1.1.0)。它从 1.1.1 开始被弃用,

MyViewModel myViewModel = new ViewModelProviders.of(this, new MyViewModelFactory(this.getApplication(), "Your string parameter")).get(MyViewModel.class);

通用示例(适用于 android.arch.lifecycle:extensions:1.1.1)

MyViewModel myViewModel = new ViewModelProvider(this, viewModelFactory).get(MyViewModel.class);

或者,使用 ViewModelStore link

MyViewModel myViewModel = new ViewModelProvider(getViewModelStore(), viewModelFactory).get(MyViewModel.class);

关于android - 如何在 Android 中实现 ViewModel 工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61023487/

相关文章:

unit-testing - 设置/拆卸会损害测试的可维护性吗?

c# - 具有深度对象图的 NHibernate DTO

silverlight - 隔离存储MVVM Silverlight抛出NotSupportedException

android - 如何在一个屏幕上使用三个 fragment ?

Android 仅使用蜂窝(3G、4G、EDGE)数据进行服务器请求

c# - 将节点添加到 ViewModel 时自动更改 TreeView 的选择

ruby - 什么是 Ruby 工厂方法?

java - 构造函数有很多元素。如何重构(工厂模式)

java - 如何将 Unity 集成到 Android Activity 中

java - 使用 Eclipse 访问现有的 SQLite 数据库