我正在投入大量时间来正确理解架构组件以及所有内容如何适应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 回答
对于交互,您可以创建
Fragment
和Activity
之间共享的ViewModel
. 在这种情况下,你有一个抽象,你可以在ViewModel
LiveData
中推送一些数据,在那里它会收到一个听同一个ViewModel
的事件 .例如this method is recommended用于
Fragment
到Fragment
通信,但我认为它也适合Fragment
到Activity
.您可以使用DataBinding或Kotlin Android Extension,两者都应该适用于MVVM . 通过DataBinding应该会更好,因为它会减少样板 . 但就我个人而言,我发现Kotlin Android Extensions也很干净 .