Android MVVM - обновление ViewModel при изменении данных - PullRequest
1 голос
/ 23 марта 2019

Я работаю над приложением, используя шаблон MVVM с RxJava.Архитектура следующая: enter image description here

Впервые я использую этот шаблон, и я не уверен в том, что лучше всего обновить ViewModel (и, следовательно, соответствующийView) когда происходит изменение данных, сделанных другим компонентом приложения.

Например: предположим, у нас есть Activity, показывающий список пользователей, за которыми я следую (например, социальное приложение),из этого списка я выбираю пользователя и открываю его профиль в другом Activity.Теперь, начиная с этой второй Activity, я решаю отписаться от пользователя, и когда я нажимаю кнопку «Назад», чтобы вернуться к первому Activity, я бы хотел, чтобы список обновлялся автоматически (удаляя соответствующего пользователя, очевидно, без необходимости повторноскачать все данные).

Проблема в том, что два Activity имеют два разных ViewModel.Как я могу сделать изменения, сделанные вторым Activity, влияющим на ViewModel первого?Является ли обязанностью Repository сообщить первым Activity об изменениях?

  • Я бы предпочел не использовать startActivityForResult
  • Я бы не хотелвведите ViewModel первого Activity во второй

Большое спасибо!

1 Ответ

4 голосов
/ 23 марта 2019

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

Проблема состоит в том, что два действия имеют два разных ViewModel.

Я подумал, что у вас есть репозиторий, который оборачивает "Модель" (локальный источник данных), который может представлятьLiveData<*>, нет?

В этом случае все, что вам нужно сделать, это:

@Dao
public interface ItemDao {
    @Query("SELECT * FROM ITEMS")
    LiveData<List<Item>> getItemsWithChanges();

    @Query("SELECT * FROM ITEMS WHERE ID = :id")
    LiveData<List<Item>> getItemWithChanges(String id);
}

Теперь ваш репозиторий может возвращать LiveData из DAO:

public class MyRepository {
    public LiveData<List<Item>> getItems() {
        // either handle "fetch if needed" here, or with NetworkBoundResource
        return itemDao.getItemsWithChanges();
    }
}

Что вы получаете в своей ViewModel:

public class MyViewModel extends ViewModel {
    private final LiveData<List<Item>> items;

    public MyViewModel(MyRepository repository) {
        this.items = repository.getItems();
    }

    public LiveData<List<Item>> getItems() {
        return items;
    }
}

И если вы наблюдаете это, то, когда вы изменяете элемент в комнате, он автоматически обновит эти LiveData в onStart (когда вы начнете наблюдать снова).

...