Создать ViewModel с приложением

1

Я пытаюсь установить данные на ViewModel в файле, в котором я не хочу хранить ссылки на действия.

Класс A → установка данных на LiveData в ViewModel Имеет ссылку на класс приложения, но не содержит действия или фрагмента.

Класс B → чтение данных из LiveData в ViewModel Имеет ссылку на действие.

Класс B может быть уничтожен и воссоздан вместе с изменениями конфигурации Activity. Класс A постоянно хранится в памяти и сохраняет данные настройки для LiveData

Проблема: ViewModelProviders.of (действие или фрагмент).get() ViewProviders требуется действие или экземпляр фрагмента.

Теги:
android-livedata
android-viewmodel

2 ответа

0

ViewModels сильно привязаны к жизненному циклу Activity и Fragment, поэтому вы не можете использовать их с контекстом приложения и должны использовать контекст Activity и Fragment.

Если вы хотите обмениваться данными между фрагментами, вы можете использовать getActivity() чтобы получить ту же модель представления, которая будет хранить ваши данные и будет существовать до тех пор, пока ваша активность находится в области действия.

-1

Вы можете использовать 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);

        }

    }

}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню