Как реализовать ViewModel Factory в Android

Я использую Room базу данных с ViewModel. Все работает хорошо. Но требование состоит в том, что я хочу предоставить некоторую зависимость для ViewModel с помощью AndroidViewModelFactory. Я могу создать ViewModelFactory класс, который реализует ViewModelProvider.Factory. Я передаю обычную строку как зависимость от ViewModel. Код для класса Factory:

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 экземпляра. Любая помощь будет оценена по достоинству.


person Satyam Gondhale    schedule 04.04.2020    source источник
comment
Это последняя реализация для создания экземпляра ViewModel как testViewModelNew=new ViewModelProvider(MainActivity.this,factory).get(TestViewModelNew.class);   -  person Satyam Gondhale    schedule 05.04.2020


Ответы (1)


Общий пример (до 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

MyViewModel myViewModel = new ViewModelProvider(getViewModelStore(), viewModelFactory).get(MyViewModel.class);
person Chirag Bhuva    schedule 04.04.2020