Я пытаюсь установить данные на ViewModel в файле, в котором я не хочу хранить ссылки на действия.
Класс A → установка данных на LiveData в ViewModel Имеет ссылку на класс приложения, но не содержит действия или фрагмента.
Класс B → чтение данных из LiveData в ViewModel Имеет ссылку на действие.
Класс B может быть уничтожен и воссоздан вместе с изменениями конфигурации Activity. Класс A постоянно хранится в памяти и сохраняет данные настройки для LiveData
Проблема: ViewModelProviders.of (действие или фрагмент).get() ViewProviders требуется действие или экземпляр фрагмента.
ViewModels сильно привязаны к жизненному циклу Activity и Fragment, поэтому вы не можете использовать их с контекстом приложения и должны использовать контекст Activity и Fragment.
Если вы хотите обмениваться данными между фрагментами, вы можете использовать getActivity()
чтобы получить ту же модель представления, которая будет хранить ваши данные и будет существовать до тех пор, пока ваша активность находится в области действия.
Вы можете использовать AndroidViewModel, это связано с жизненным циклом приложения.
Пример:
public class ProductViewModel extends AndroidViewModel {
private final LiveData<ProductEntity> mObservableProduct;
public ObservableField<ProductEntity> product = new ObservableField<>();
private final int mProductId;
private final LiveData<List<CommentEntity>> mObservableComments;
public ProductViewModel(@NonNull Application application, DataRepository repository,
final int productId) {
super(application);
mProductId = productId;
mObservableComments = repository.loadComments(mProductId);
mObservableProduct = repository.loadProduct(mProductId);
}
/**
* Expose the LiveData Comments query so the UI can observe it.
*/
public LiveData<List<CommentEntity>> getComments() {
return mObservableComments;
}
public LiveData<ProductEntity> getObservableProduct() {
return mObservableProduct;
}
public void setProduct(ProductEntity product) {
this.product.set(product);
}
/**
* A creator is used to inject the product ID into the ViewModel
* <p>
* This creator is to showcase how to inject dependencies into ViewModels. It not
* actually necessary in this case, as the product ID can be passed in a public method.
*/
public static class Factory extends ViewModelProvider.NewInstanceFactory {
@NonNull
private final Application mApplication;
private final int mProductId;
private final DataRepository mRepository;
public Factory(@NonNull Application application, int productId) {
mApplication = application;
mProductId = productId;
mRepository = ((BasicApp) application).getRepository();
}
@Override
public <T extends ViewModel> T create(Class<T> modelClass) {
//noinspection unchecked
return (T) new ProductViewModel(mApplication, mRepository, mProductId);
}
}
}