我使用MVP已有很长时间了,我开始转移到MVP和MVVM之间的混合状态
详细地,我的应用将像这样:
我的问题:
例如,假设我有一个项目列表,而用户长按一个项目列表,则该体系结构的哪个部分应负责检查用户是否有权执行此操作,并让他们编辑该项目或显示错误消息?
例如,假设活动下有3个片段,并且有一个ViewModel可以满足这些需求
我可以使用类似的东西吗
class MainViewModel : ViewModel() , IFragmentA, IFragmentB, IFragmentC
,然后当我尝试在片段中获取ViewModel时,我可以编写如下内容:
lateinit var viewModel: IFragmentA
override fun onAttach(context: Context?) {
super.onAttach(context)
vm = ViewModelProviders.of(context as AppCompatActivity).get(IFragmentA::class.java)
}
注意:我知道上面的代码不起作用,我要问的是,是否有一种类似的方法可以起作用
例如,如果用户尝试删除条目,而我希望他们输入密码,则流程为:
感谢您提供的任何帮助
答案 0 :(得分:4)
我最近将我的应用程序之一从MVP移植到了MVVM体系结构。不管是部分完成还是全部完成,您都在朝着美观大方的方向发展,并且您会喜欢它。
在查看答案之前,请先查看此MVVM架构图以及其中的一些要做与不要做的事情
让我们在这里查看每个类的角色。
-监听MutableLiveData Obeservers并将Data设置为视图,这里没有其他逻辑。
google中有一个待办事项应用示例项目,该项目使用MVVM。请参考它,将非常有帮助。
在MVVM的Google示例项目中,实际上有此用例的示例。
public static AddEditTaskViewModel obtainViewModel(FragmentActivity activity) {
// Use a Factory to inject dependencies into the ViewModel
ViewModelFactoryfactory= ViewModelFactory.getInstance(activity.getApplication());
return ViewModelProviders.of(activity, factory).get(AddEditTaskViewModel.class);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final View root = inflater.inflate(R.layout.addtask_frag, container, false);
if (mViewDataBinding == null) {
mViewDataBinding = AddtaskFragBinding.bind(root);
}
mViewModel = AddEditTaskActivity.obtainViewModel(getActivity());
mViewDataBinding.setViewmodel(mViewModel);
mViewDataBinding.setLifecycleOwner(getActivity());
setHasOptionsMenu(true);
setRetainInstance(false);
return mViewDataBinding.getRoot();
}
希望有帮助。