在ViewModel与片段/活动交互和通讯之间应用MVVM

阿林

我花费大量时间来正确理解架构组件以及一切如何适应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,例如, 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的理解,该视图仅应负责显示信息,因此,在片段或活动中无需进行任何实际的逻辑甚至处理。此时,我有两个问题:

  1. 以常规方式,我将创建一个接口,例如onFragmentAction在中实现它activity然后,fragment当我想通知活动做某事时,我会做callback.onFragmentAction(params)onFragmentAction活动中的会触发并采取相应的行动。在MVVM中如何处理这种情况?片段如何与其父活动对话?
  2. 按照常规方式,我可以在片段的内部进行onCreateView布局,填充布局,用于findViewById获取视图并使用,例如textView.setText()或button.setOnClickListener()。如何在MVVM中完成此操作?使用数据绑定?
艾奥恩·沙瓦泽(Ioane Sharvadze)

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

为了进行交互,您可以创建ViewModel之间共享的内容在这种情况下,您有一个抽象概念,即您将一些数据推送到发生事件的任何人,无论谁监听相同的数据FragmentActivityViewModel LiveDataViewModel

例如,推荐此方法用于FragmentFragment通信,但我认为它也适合FragmentActivity

按照常规方式,我可以在片段的onCreateView内填充布局,使用findViewById获取视图并使用,例如textView.setText()或button.setOnClickListener()。如何在MVVM中完成此操作?使用数据绑定?

您可以使用DataBinding或Kotlin Android Extension,两者都可以与MVVM配合使用。通过DataBinding应该更好,因为它将减少样板。但是我个人觉得Kotlin Android Extensions也很干净。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章