在ViewModel和Fragment/Activity之间应用MVVM进行交互和通信

3

我正在投入大量时间来正确理解架构组件及其如何适配MVVM模式。到目前为止,这是我对事物的看法(没有进行Dagger注入,因为我还没有做到):

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;
}

除此之外还可以根据我从数据库中需要什么不同的POJO,例如:UserWithRoles

c)UserDao 负责从Room Database获取或插入/更新信息。这里,对于@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) 在ViewModel和Dao之间使用RepositoryUser作为仓库

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的理解,视图应该只负责显示信息,不应在片段或活动中进行实际逻辑操作甚至处理。现在我有两个问题:

  1. 通常情况下,我会创建一个接口,例如onFragmentAction并在activity中实现它。然后在fragment中,当我想要通知activity执行某些操作时,我会执行callback.onFragmentAction(params),activity中的onFragmentAction将触发并相应地执行。MVVM中如何处理这种场景?片段如何与其父活动通信?
  2. 通常情况下,我会在片段的onCreateView中膨胀布局,使用findViewById获取视图并使用,例如textView.setText()button.setOnClickListener()。在MVVM中如何做到这一点?使用DataBinding吗?
1个回答

4
在常规情况下,我会创建一个接口,例如onFragmentAction,并在activity中实现它。然后在fragment中,当我想通知activity执行某些操作时,我会调用callback.onFragmentAction(params),并且activity中的onFragmentAction将触发并相应地执行操作。在MVVM中如何处理这种情况?fragment如何与其父activity通信?
对于交互,您可以创建在FragmentActivity之间共享的ViewModel。在这种情况下,您有一个抽象层,其中您将一些数据推入ViewModel LiveData中,所有监听同一ViewModel的人都会收到事件。
例如此方法建议用于FragmentFragment通信,但我认为它也适用于FragmentActivity
在常规情况下,在片段的onCreateView中,会使用inflate布局、findViewById获取视图并使用例如textView.setText()或button.setOnClickListener()等方法。在MVVM中应该如何完成这些操作呢?可以使用DataBinding或Kotlin Android Extension,两者都适用于MVVM。虽然使用DataBinding会减少样板代码,但我个人认为Kotlin Android Extensions也非常简洁。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接