Применение MVVM между взаимодействиями и коммуникациями ViewModel и Fragment / Activity - PullRequest
0 голосов
/ 06 июля 2018

Я вкладываю много времени в правильное понимание компонентов архитектуры и того, как все вписывается в шаблон MVVM. Итак, вот как я вижу вещи (не делая инъекцию Кинжала, поскольку я еще не получил это далеко):

a) UserEntity - это класс с аннотацией @Entity для обработки создания таблицы Room

@Entity(tableName="users")
public class Users{
   private long id;
   private String name;
}

b) User класс pojo в модели, чтобы использовать его вокруг приложения и при необходимости иметь дополнительные поля.

public class User{
   private long id;
   private String name;
   private List<Role> roles;
   private Preferences preferences;
}

помимо этого могут быть разные pojos в зависимости от того, что мне нужно от db, например, UserWithRoles

c) UserDao заботится о получении или вставке / обновлении информации в базе данных комнаты. Здесь для @Insert, @Update я могу использовать UserEntity, но для @Query я также могу использовать классы pojo

@Dao 
public abstract class UserDao{
    @Insert
    public abstract long insertUser(User user)

   @Query("Select someFields from inner joined tables")
   public abstract LiveData<List<UserRoles> getUsersWithRoles();
}

d) Иметь RepositoryUser в качестве хранилища между ViewModel и Dao

public class RepositoryUser{
       private UserDao userDao;

      public RepositoryUser(Application app){
            Database db = Databaase.getDatabase(app.getApplicationContext);
            userDao = db.userDao(); 
      }
      public LiveData<List<UserWithRoles>> getUsersWithRoles(){
            return userDao.getUsersWithRoles()
      }
    }

e) UserWithRolesViewModel будет доступно для фрагмента, который показывает список с пользователями и их ролями

public class UserWithRolesViewModel extends AndroidViewModel{
  private RepositoryUser repositoryUser;

  public UserWithRolesViewModel(Application app){
         super(app);
         repositoryUser = new RepositoryUser(app);
  }

  public LiveData<List<UserWithRoles>> getUsersWithRoles(){
                return repositoryUser.getUsersWithRoles()
          }
}

f) В своем фрагменте я могу сделать что-то вроде:

public void onCreate(...){
    viewModel = ViewModelProviders.of(this).get(UserWithRolesViewModel.class);
}

public View onCreateView(...){
  viewModel.getUsersWithRoles().observe(...)
          public void onChanged(...){
          adapter.setData(...);
       }
}

Однако, некоторые части отсутствуют. Насколько я понимаю, согласно MVVM представление должно отвечать только за отображение информации, поэтому внутри фрагмента или действия не должно быть никакой реальной логики или даже обработки. На данный момент у меня есть 2 вопроса:

  1. По обычной схеме я бы создал интерфейс, например onFragmentAction, и реализовал его в activity. Затем в fragment, когда я хотел сообщить действиям что-то сделать, я бы сделал callback.onFragmentAction(params), и onFragmentAction в действии сработал бы и действовал бы соответственно Как этот сценарий обрабатывается в MVVM? Как фрагмент говорит с его родительской активностью?
  2. По обычному принципу, который я бы использовал внутри фрагмента onCreateView, накачайте макет, используйте findViewById, чтобы получить представления и используйте, например, textView.setText () или button.setOnClickListener (). Как это можно сделать в MVVM? Использовать DataBinding?

1 Ответ

0 голосов
/ 06 июля 2018

На обычном пути я бы, например, создал интерфейс onFragmentAction и внедрить его в деятельность. Тогда на фрагменте, когда я хотел сообщить деятельности, чтобы сделать что-то, я бы сделал callback.onFragmentAction (params) и onFragmentAction в активность будет срабатывать и действовать соответственно. Как этот сценарий обрабатывается в MVVM? Как фрагмент говорит с его родительской активностью?

Для взаимодействия вы можете создать ViewModel, который совместно используется между Fragment и Activity. В этом случае у вас есть абстракция, куда вы помещаете некоторые данные в ViewModel LiveData, где он получает событие, кто бы ни слушал тот же ViewModel.

Например, этот метод рекомендуется для Fragment до Fragment сообщений, но я думаю, что он также подходит для Fragment до Activity.

На обычном способе, который я бы имел внутри onCreateView фрагмента, надуйте макет, используйте findViewById, чтобы получить представления и используйте, для экземпляр textView.setText () или button.setOnClickListener (). Как может это сделать в MVVM? Использовать привязку данных?

Вы можете использовать либо DataBinding, либо Kotlin Android Extension , оба должны работать с MVVM. Через DataBinding должно быть лучше, так как это уменьшит шаблон. Но лично я считаю Kotlin Android Extensions очень чистым.

...