代码之家  ›  专栏  ›  技术社区  ›  Alin

在viewmodel和片段/活动交互和通信之间应用mvvm

  •  3
  • Alin  · 技术社区  · 7 年前

    我正在投入大量时间来正确理解体系结构组件,以及如何将所有内容都融入mvvm模式。到目前为止,我是这样看事情的(没有做匕首注射,因为我还没有那么远):

    (一) UserEntity 是一个 @Entity 要处理的批注 Room 的表创建

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

    (二) User 模型中的pojo类在应用程序周围使用它,并根据需要提供补充字段。

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

    除此之外,还可以有不同的pojo,这取决于我从db需要什么,例如, UserWithRoles

    (三) UserDao 负责获取或插入/更新房间数据库中的信息。在这里,为了 @Insert ,请 @Update 我可以使用 用户实体 但是为了 @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()
          }
        }
    

    (英) 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 当我想通知活动做某事时,我会 callback.onFragmentAction(params) 以及 碎片动作 在活动中会开火并采取相应的行动。这个场景在mvvm中是如何处理的?片段如何与它的父活动对话?
    2. 按照常规的方法我会在碎片的内部 onCreateView ,为布局充气,使用 findViewById 获取视图并使用,例如textView.settext()或button.setOnClickListener()。在mvvm中如何做到这一点?使用数据绑定?
    1 回复  |  直到 7 年前
        1
  •  4
  •   Ioane Sharvadze    7 年前

    通常,我会创建一个接口,例如 onfragmentaction并在活动中实现它。然后在碎片上当我 想通知活动做点什么,我会做的 callback.onFragmentAction(params)和 活动会触发并相应地采取行动。这种情况是如何处理的 在MVVM中?片段如何与它的父活动对话?

    对于交互,可以创建 ViewModel Fragment Activity 是的。在这种情况下,您有一个抽象,其中您将一些数据推入 视图模型 LiveData 在那里有个活动谁听谁的 视图模型 是的。

    例如 this method is recommended 对于 碎片 碎片 沟通,但我认为它也适合 碎片 活动 是的。

    按照常规方法,我会在片段的oncreateview中, 对布局进行充气,使用findviewbyid获取视图并使用 实例textView.settext()或button.setOnClickListener()。怎么能 这是在mvvm中完成的吗?使用数据绑定?

    您可以使用数据绑定或 Kotlin Android Extension ,使用mvvm两者都应该没问题。 通过数据绑定应该更好,因为它将减少样板文件。 但就我个人而言,我发现Kotlin Android扩展也非常干净。