直接实例化ViewModels,而不使用ViewModelProviders.of方法

时间:2017-07-03 01:10:32

标签: android dagger-2 android-architecture-components dagger

我有一个名为RecipesViewModel的ViewModel。通常,我以这种方式实例化它:

RecipesViewModel viewModel = ViewModelProviders.of(this, new ViewModelProvider.Factory() {
            @Override
            public <T extends ViewModel> T create(Class<T> modelClass) {
                return (T) new RecipesViewModel(recipesRepository);
            }
        }).get(RecipesViewModel.class);

但现在我使用dagger2,因此我在此ViewModel的构造函数上添加了@Inject注释,因此我可以使用字段注入器将其直接注入到我的片段中。

我的问题是:我是否会以这种方式而不是ViewModelProviders.of方式丢失一些启动视图模型的内容?我的ViewModel已经被Scoped,因此在上下文中只创建一个实例。

其他选项是仅将工厂实例化移动到dagger2模块,但如果没有问题,我更喜欢第一个aproach。

- 编辑 -

阅读文档android.arch.lifecycle.ViewModel,我有点害怕。使用ViewModelProviders.of提供Scope(片段或活动)。如果我直接实例化它将是什么范围?

  

ViewModel是一个负责准备和管理的类   活动或片段的数据。它也处理   活动/片段与其他人的沟通   应用程序(例如,调用业务逻辑类)。

     

始终与范围(片段)关联创建ViewModel   或者活动)并且只要范围有效就会保留。   例如。如果它是一个活动,直到它完成。

     

换句话说,这意味着如果ViewModel不会被销毁   其所有者因配置更改(例如轮换)而被销毁。该   所有者的新实例将重新连接到现有的   视图模型。

- /编辑 -

RecipesViewModel代码如下所示:

@PerActivity
public class RecipesViewModel extends ViewModel {
    private static final String TAG = "RecipesViewModel";
    private final RecipesRepository recipesRepository;

    private LiveData<List<Recipe>> recipes = null;

    @Inject
    public RecipesViewModel(RecipesRepository recipesRepository) {
        this.recipesRepository = recipesRepository;
    }

    public final void loadAll() {
        recipes = recipesRepository.getRecipes();
    }

    public LiveData<List<Recipe>> getRecipes() {
        return recipes;
    }
}

1 个答案:

答案 0 :(得分:1)

对我来说(我需要研究这个),但是注入视图模型而不是使用ViewModelProviders功能意味着你会丢失一些简单的活动片段通信。

例如from the docs他们提供了托管2个片段的活动的示例。如果一个片段需要与另一个片段交谈,那么之前的方法是通过活动维护一个接口,该活动也必须处理该接口的生命周期。相反,现在您可以从ViewModelProviders&#39; repo&#39;中取出它。随时随地。