У меня есть ViewModel под названием 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 уже имеет область видимости, поэтому в контексте создается только один экземпляр.
Другой вариант - переместить только фабричный экземпляр в модуль dagger2, но если нет проблем, я предпочитаю первый подход.
-- РЕДАКТИРОВАТЬ --
Читая документацию android.arch.lifecycle.ViewModel
, боюсь немного больше. Где использовать ViewModelProviders.of для предоставления области действия (фрагмента или действия). Если я создам его напрямую, что будет с областью действия?
ViewModel - это класс, который отвечает за подготовку и управление данными для действия или фрагмента. Он также обрабатывает связь Activity / Fragment с остальной частью приложения (например, вызывает классы бизнес-логики).
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;
}
}
ViewModelProviders.of
. Этого также не произойдет до тех пор, пока компонент кинжала будет одинаковым - предоставленная модель просмотра также такая же. - person Fred   schedule 03.07.2017