我有一个名为RecipesViewModel
. 通常,我以这种方式实例化它:
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,所以我@Inject
在这个 ViewModel 的构造函数上放了一个注释,所以我可以使用字段注入器将它直接注入到我的片段中。
我的问题是:我是否会以这种方式而不是ViewModelProviders.of
方式启动视图模型?我的 ViewModel 已经是 Scoped 了,所以在上下文中只创建了一个实例。
其他选项是仅将工厂实例化移动到 dagger2 模块,但如果没有问题,我更喜欢第一种方法。
- 编辑 -
阅读文档android.arch.lifecycle.ViewModel
,我有点害怕。当使用 ViewModelProviders.of 提供范围(片段或活动)时。如果我直接实例化它,作用域是什么?
ViewModel 是一个类,负责为 Activity 或 Fragment 准备和管理数据。它还处理 Activity / Fragment 与应用程序其余部分的通信(例如调用业务逻辑类)。
ViewModel 始终与范围(片段或活动)关联创建,并且只要范围处于活动状态就会保留。例如,如果它是一个活动,直到它完成。
换句话说,这意味着如果 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;
}
}