片段之间的共享视图模型,没有范围限定到 activity?
Shared viewmodel between fragments, without scoping to the activity?
-
android
-
android-fragments
-
android-viewmodel
-
android-architecture-components
-
android-architecture-navigation
使用新的导航体系结构组件,我有一个 activity 作为导航主机,我的屏幕有多个片段。现在我有一个 EditProfileFragment,用户可以在其中单击一个按钮,然后打开另一个片段,其中包含可供选择的国家/地区列表。假设我想将该国家/地区选择的结果分享回 EditProfileFragment。总体思路是,我将为所有 "edit profile" 操作使用一个 EditProfileViewModel。
如何在这些片段之间共享选定的国家/地区?我正在考虑使用共享视图模型,但我对将其范围限定为 activity 犹豫不决,因为我不希望它在用户完成 "edit profile" 流程时持续存在。
我应该考虑其他 clean/recommended 方法吗?也许是一个暂时持有该值的单身人士?
共享视图模型确实更容易,但正如您所说,它带来了其他问题,例如将视图模型的范围限定到更高的上下文以进行简单的信息交换。
恕我直言,共享视图模型在某些情况下并不是一个坏方法。我正在开发一个有 5 个选项卡的应用程序,第一个选项卡就像是第二个和第三个选项卡的摘要。使用共享视图模型是一个不错的选择,因为我只是重用数据,只是更改适配器在相应视图中显示的项目数,逻辑被重用。
听起来您的个人资料和个人资料编辑页面中有共同的逻辑/项目。我不知道有多少,但如果你觉得在这两者之间共享一个视图模型还不够,请记住,仅仅因为你正在使用视图模型并不意味着你必须使用它们来共享/存储/传递一些数据。例如:
- 导航到具有获取数据的上一个片段。
- 您可以将 "profile" 保存到持久性并更改存储的内容。当您的个人资料视图模型被(重新)创建时,它会从持久性中获取最新值。
- 您可以直接在服务器中更新您的个人资料,然后在个人资料中重新获取。
- 你可以把上面这两个混用。
回答我自己的问题,以供将来参考:
因为我想保持 ViewModel-View(控制器)/Fragment 之间的一对一关系,所以我使用了一个 UserRepository
,其中包含一个 "temporary state" 对象,用于此类情况。
android
android-fragments
android-viewmodel
android-architecture-components
android-architecture-navigation
使用新的导航体系结构组件,我有一个 activity 作为导航主机,我的屏幕有多个片段。现在我有一个 EditProfileFragment,用户可以在其中单击一个按钮,然后打开另一个片段,其中包含可供选择的国家/地区列表。假设我想将该国家/地区选择的结果分享回 EditProfileFragment。总体思路是,我将为所有 "edit profile" 操作使用一个 EditProfileViewModel。
如何在这些片段之间共享选定的国家/地区?我正在考虑使用共享视图模型,但我对将其范围限定为 activity 犹豫不决,因为我不希望它在用户完成 "edit profile" 流程时持续存在。
我应该考虑其他 clean/recommended 方法吗?也许是一个暂时持有该值的单身人士?
共享视图模型确实更容易,但正如您所说,它带来了其他问题,例如将视图模型的范围限定到更高的上下文以进行简单的信息交换。
恕我直言,共享视图模型在某些情况下并不是一个坏方法。我正在开发一个有 5 个选项卡的应用程序,第一个选项卡就像是第二个和第三个选项卡的摘要。使用共享视图模型是一个不错的选择,因为我只是重用数据,只是更改适配器在相应视图中显示的项目数,逻辑被重用。
听起来您的个人资料和个人资料编辑页面中有共同的逻辑/项目。我不知道有多少,但如果你觉得在这两者之间共享一个视图模型还不够,请记住,仅仅因为你正在使用视图模型并不意味着你必须使用它们来共享/存储/传递一些数据。例如:
- 导航到具有获取数据的上一个片段。
- 您可以将 "profile" 保存到持久性并更改存储的内容。当您的个人资料视图模型被(重新)创建时,它会从持久性中获取最新值。
- 您可以直接在服务器中更新您的个人资料,然后在个人资料中重新获取。
- 你可以把上面这两个混用。
回答我自己的问题,以供将来参考:
因为我想保持 ViewModel-View(控制器)/Fragment 之间的一对一关系,所以我使用了一个 UserRepository
,其中包含一个 "temporary state" 对象,用于此类情况。