我正在尝试实现MVVM partern。 所以我有一个包含ViewPager的Activity,里面有3个片段。每个片段都在同一个实体上工作。
在Activty内部,我创建了一个ViewModel实例。
protected void onCreate(Bundle savedInstanceState) {
TaskViewModel.Factory factory = new
TaskViewModel.Factory(this.getApplication(), mTaskId);
mTaskViewModel = ViewModelProviders.of(this, factory).get(TaskViewModel.class);
}
现在用片段分享它的正确方法是什么?
getter / setter是否仍然遵守指南?
由于
答案 0 :(得分:1)
如果你想在你的片段(ViewPager)之间共享相同的ViewModel,你可以使用你的活动来初始化你的ViewModel而不是"这个" (片段)。
"中的第一个参数"定义将使用哪个LivecycleOwner。由于您选择了活动,因此ViewModel将在Fragments之间保持不变并保持活动直到活动被销毁。 (科特林)
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
var viewModel = ViewModelProviders.of(
activity, //define who's the holder of the ViewModel
viewModelFactory)
.get(YourVm::class.java)
/** ..... **/
}
Factory本身仅用于初始化ViewModel(带数据)。
Android示例:
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
YourVm viewModel = ViewModelProviders.of(
getActivity(), //define who's the holder of the ViewModel
viewModelFactory)
.get(YourVm::class);
/** ... **/
}
这意味着您可以在活动中初始化/使用ViewModel,并使用ViewModelProviders.of()获取持久性ViewModel。