【问题标题】:Do you need to use a ViewModel Factory if not using dependency injection?如果不使用依赖注入,是否需要使用 ViewModel 工厂?
【发布时间】:2023-03-25 16:59:01
【问题描述】:

我看到了很多对ViewModel.Factory 的引用,但我遇到的每个示例都引用了依赖注入。基于这个问题:Why a viewmodel factory is needed in Android? 当您的构造函数有参数时,这似乎是必需的。这是否也适用于不使用 Dagger 等依赖注入框架的项目?

这是我想要做的:

public CatalogVerticalListViewModel(@NonNull Application application, RecyclerView.Adapter adapter) {
    super(application);

    final CatalogAdapter catalogAdapter = (CatalogAdapter) adapter;

    CatalogManager cm = new CatalogManager(Constants.BASE_URL);
    pageData = cm.getCatalog();
}

我需要/想要将我的适配器传递给ViewModel,我想知道是否需要为此创建一个自定义工厂。如果是这样,那会是什么样子?

【问题讨论】:

  • 但是为什么要将适配器传递给 ViewModel?不应该在 ViewModel 中使用 LiveData 并在 Activity/Fragment 中观察它,然后设置适配器吗?

标签: android mvvm


【解决方案1】:

如果你有一个带有构造函数参数的视图模型,你将不得不为此编写一个工厂。避免这种情况的一种方法是删除那些构造函数参数并使用方法设置这些对象(虽然不是建议的做法)。

你的工厂看起来像这样,

public class CatalogViewModelFactory implements ViewModelProvider.Factory {
    private Application application;
    private RecyclerView.Adapter adapter;

    public CatalogViewModelFactory (@NonNull Application application, 
                  RecyclerView.Adapter adapter){
                this.application = application;
                this.adapter = adapter;

               }
        public <T extends ViewModel> T create(Class<T> modelClass) {
            if (modelClass.isAssignableFrom(CatalogVerticalListViewModel.class)) {
                return (T) new CatalogVerticalListViewModel(application,adapter);
            }
            throw new IllegalArgumentException("Unknown ViewModel class");
        }
    }

并在活动中使用它,片段...作为

 CatalogViewModelFactory  factory =
            new CatalogViewModelFactory (application,adapter);

    viewModel = ViewModelProviders.of(this, factory).get(CatalogVerticalListViewModel.class);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    • 2018-07-01
    • 1970-01-01
    相关资源
    最近更新 更多