首页 文章

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

提问于
浏览
1

我正在投入大量时间来正确理解架构组件以及所有内容如何适应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;
}

除此之外可以有不同的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的理解,视图应该只负责显示信息,因此在片段或活动中没有实际的逻辑甚至处理 . 此时我有两个问题:

  • 在常规方式上,我会创建一个接口,例如 onFragmentAction 并在 activity 中实现它 . 然后在 fragment ,当我想通知活动做某事时,我会做 callback.onFragmentAction(params) 并且活动中的 onFragmentAction 会相应地触发并采取行动 . 如何在MVVM中处理这种情况?片段如何与它的父活动对话?

  • 在常规方式中,我会在片段的 onCreateView 内部,使布局膨胀,使用 findViewById 获取视图并使用,例如textView.setText()或button.setOnClickListener() . 如何在MVVM中完成?使用DataBinding?

1 回答

  • 2

    在常规方式上,我将创建一个接口,例如onFragmentAction并在activity中实现它 . 然后在片段上当我想通知活动做某事时,我会做callback.onFragmentAction(params)并且活动中的onFragmentAction会相应地触发并采取行动 . 如何在MVVM中处理这种情况?片段如何与它的父活动对话?

    对于交互,您可以创建 FragmentActivity 之间共享的 ViewModel . 在这种情况下,你有一个抽象,你可以在 ViewModel LiveData 中推送一些数据,在那里它会收到一个听同一个 ViewModel 的事件 .

    例如this method is recommended用于 FragmentFragment 通信,但我认为它也适合 FragmentActivity .

    在常规方式中,我将在片段的onCreateView中,扩充布局,使用findViewById来获取视图和使用,例如textView.setText()或button.setOnClickListener() . 如何在MVVM中完成?使用DataBinding?

    您可以使用DataBinding或Kotlin Android Extension,两者都应该适用于MVVM . 通过DataBinding应该会更好,因为它会减少样板 . 但就我个人而言,我发现Kotlin Android Extensions也很干净 .

相关问题