Android 如果我使用SharedViewModel传递数据,我必须在片段中使用多少视图模型?

Android 如果我使用SharedViewModel传递数据,我必须在片段中使用多少视图模型?,android,android-architecture-components,android-viewmodel,android-architecture-navigation,android-jetpack-navigation,Android,Android Architecture Components,Android Viewmodel,Android Architecture Navigation,Android Jetpack Navigation,我正在使用导航组件,我需要将数据从片段B传递回片段A。我已经从中读取了我需要使用的内容 例如,假设我有一个显示餐厅列表的RestaurantListFragment。为了处理这个片段的网络和业务逻辑,我制作了RestaurantListViewModel 第二个片段是RestaurantDetailFragment。为了处理这个片段中的一些操作和业务逻辑,我创建了RestaurantDetailViewModel 现在我需要将数据从RestaurantDetailFragment传递回Resta

我正在使用导航组件,我需要将数据从片段B传递回片段A。我已经从中读取了我需要使用的内容

例如,假设我有一个显示餐厅列表的
RestaurantListFragment
。为了处理这个片段的网络和业务逻辑,我制作了
RestaurantListViewModel

第二个片段是
RestaurantDetailFragment
。为了处理这个片段中的一些操作和业务逻辑,我创建了
RestaurantDetailViewModel

现在我需要将数据从
RestaurantDetailFragment
传递回
RestaurantListFragment
,据说我需要使用SharedViewModel。但是现在我很困惑

如果我使用SharedViewModel传递数据,那么在一个片段中会有2个ViewModel?在
RestaurantDetailFragment
中,我将拥有
RestaurantDetailViewModel
XSharedViewModel
,在
RestaurantDetailFragment
中,我将拥有
RestaurantListViewModel
XSharedViewModel

那么在SharedViewModel中,它只包含需要传递回前一个片段的数据

或者我只需要制作一个视图模型(SharedViewModel),它将为我的两个片段提供服务?(我不再需要创建
RestaurantDetailViewModel
RestaurantListViewModel
)。我很困惑

两种方法都有效:

  • 您可以仅对
    RestaurantDetailFragment
    RestaurantListFragment
    之间共享的数据和方法使用
    SharedViewModel
    ,并将仅对
    RestaurantListFragment
    而非
    RestaurantDetailFragment
    所需的逻辑保留在中
    RestaurantListViewModel
    ,反之亦然

  • 无论如何,您也可以将
    RestaurantDetailViewModel
    RestaurantListViewModel
    的所有逻辑放在
    SharedViewModel
    中,并去掉其他两个视图模型。虽然这不会抛出任何错误,但它违反了

  • 这两种方法都有效:

  • 您可以仅对
    RestaurantDetailFragment
    RestaurantListFragment
    之间共享的数据和方法使用
    SharedViewModel
    ,并将仅对
    RestaurantListFragment
    而非
    RestaurantDetailFragment
    所需的逻辑保留在中
    RestaurantListViewModel
    ,反之亦然

  • 无论如何,您也可以将
    RestaurantDetailViewModel
    RestaurantListViewModel
    的所有逻辑放在
    SharedViewModel
    中,并去掉其他两个视图模型。虽然这不会抛出任何错误,但它违反了

  • 只有创建一个视图模型,才能在两个片段之间共享或重用数据。SharedViewModel背后的概念是,它将创建一个对象并将结果存储在视图模型的LiveData中,并将在附加到它的一个活动生命周期内的不同片段中再次重用

    如果你愿意的话,你可以在这张推荐表上填写

    只有创建一个视图模型,才能在两个片段之间共享或重用数据。SharedViewModel背后的概念是,它将创建一个对象并将结果存储在视图模型的LiveData中,并将在附加到它的一个活动生命周期内的不同片段中再次重用


    如果您愿意,您可以采用引用形式。您可以拥有一个属于片段的父活动的ViewModel,您可以使用它来处理片段之间的公共数据。每个片段都可以有自己的ViewModel来处理每个片段所需的逻辑。如果这样做,请不要忘记测试进程死亡。您可以有一个属于片段的父活动的ViewModel,并且可以使用它来处理片段之间的公共数据。每个片段都可以有自己的ViewModel来处理每个片段所需的逻辑。如果这样做,不要忘记测试进程死亡。
    虽然这不会引发任何错误,但它违反了关注点的分离。
    这是什么废话?他们都在经营“餐厅”。显然,他们有着非常相似的担忧。您需要将它们分开的原因是,如果一个细节可以打开一个细节,那么它将导致冲突。这取决于您的抽象级别。如果你考虑餐馆的细节和餐馆的两个不同的问题,那就不是胡说八道。<代码>虽然这不会造成任何错误,但是它违反了关注的分离。< /代码>这是什么废话?他们都在经营“餐厅”。显然,他们有着非常相似的担忧。您需要将它们分开的原因是,如果一个细节可以打开一个细节,那么它将导致冲突。这取决于您的抽象级别。如果你考虑餐馆的细节和餐馆的两个不同的问题,那就不是胡说八道了。