Компоненты архитектуры Android Проблема контекста ViewModel

Я пытаюсь использовать новые компоненты архитектуры в Android, и до сих пор это работало очень хорошо. Однако я наткнулся на архитектурную проблему.

У меня есть MainActivity, в котором находится множество фрагментов: A, B и C. До сих пор каждый раз, когда мне нужна моя ViewModel (VM), я извлекаю ее в контексте MainActivity (например: MyViewModel vm = ViewModelProviders.of(getActivity()).get(MyViewModel.class);). Теперь подумайте об этом:

  • Фрагмент C позволяет пользователю выбрать какое-то значение и записать его в файл VM.
  • Фрагмент A использует фрагмент C, чтобы пользователь мог выбрать значение, а затем A считывает значение непосредственно из VM и показывает его в своем пользовательском интерфейсе.
  • Фрагмент B использует тот же подход, что и фрагмент A.

Проблема в том, что поскольку VM всегда находится в контексте MainActivity, если фрагмент A использовался до B, значение все равно будет доступно, а B покажет некоторые старые данные.

Наиболее очевидным решением, которое я вижу, является создание VM в контексте фрагментов A и B соответственно. Но тогда я не могу понять, как предоставить фрагменту C доступ к этим VM.

Я также мог бы создать VM в контексте фрагмента C, но для этого потребовались бы фрагменты A и B для создания экземпляра C, что я не думаю, что это хорошее решение.

Третьим решением было бы сохранить текущий подход и очистить данные в VM, когда это уместно, но я думаю, что это тоже беспорядок.

Каков наилучший способ сделать это?


person mfb    schedule 11.09.2017    source источник


Ответы (1)


Вы можете иметь сопоставление в виртуальной машине и хранить значения для A и B под разными ключами.

Таким образом, когда A запускает C, он передает свой A_key в качестве аргумента. Когда пользователь выбирает значение в C, оно сохраняется в карте виртуальной машины с использованием A_key в качестве ключа. Когда A проверяет, доступно ли значение, оно проверяет только значение, сохраненное для A_key.

То же самое для B и B_key.

person Vasiliy    schedule 11.09.2017