android 单个合成功能的多个视图模型(屏幕)

t3irkdon  于 2022-12-25  发布在  Android
关注(0)|答案(2)|浏览(118)

我正在开发一个像Gmail这样的应用程序。在纵向模式下,它只显示邮件列表作为应用程序的主屏幕,当用户点击一条邮件时,应用程序将导航到邮件详细信息屏幕。两个屏幕都有一个ViewModel:消息列表视图模型和消息详细视图模型。
在横向模式下,我想同时显示两个屏幕,彼此相邻:左侧为信息列表屏幕,右侧为所选信息的信息详细信息屏幕。
我的解决方案是,我创建一个路由的消息列表屏幕来处理不同的情况:

  • 如果应用程序处于纵向模式且未选择任何消息,则只会显示消息列表屏幕
  • 如果应用程序处于纵向模式并选择了消息,则应用程序将显示消息详细信息屏幕,而不是显示消息列表屏幕
  • 如果应用程序处于横向模式,它将显示两个屏幕。

所以基本上我有一个组合函数来处理所有这些情况。我的问题是,在这个组合函数中有多个视图模型是一个好的实践吗?

hyrbngr7

hyrbngr71#

这里不太可能有一个正确的答案,但根据状态持有者和UI状态:

**注意:**您应该只在目标级别的UI中使用ViewModel。您不应该在UI的可重用部分中使用它们,例如搜索栏或Chip组。在这些情况下,普通类更适合。

听起来您这里有一个目标级UI,根据配置(横向/纵向)的不同,它有不同的外观。因此,听起来单个ViewModel更符合当前的指导方针。

cnh2zyt3

cnh2zyt32#

有一个更好的解决方案,例如,只有一个视图模型发出您需要的uiStates
对于Portrait(未打开消息),您可以发出只包含消息列表的uiState
对于Portrait(消息打开),您可以发出仅包含消息详细信息的uiState
对于横向(显示两者),您可以发出包含消息详细信息+选定消息(在列表中选择)+消息列表的uiState
由于您没有提供任何代码,我对我的意思做了一个小的绘图,您可以只从ViewModelemit数据,然后在您的Activity / Fragment中观察它,然后根据uiState传播并打开正确的可组合对象。
您可以将这3个可组合对象包含在1中,但对于该**,您需要将3个uiState发送到该可组合对象**,并使用when语句决定打开哪个可组合对象。
我认为像这样分开这些屏幕会让它更干净,而且你不需要超过1 viewModel

根据@fstanis的回答,是这样吗?没有正确的答案,这取决于你想遵循什么样的架构,以及你想如何做。
根据你的描述,你可以用两种方法
每件事都有一个ViewModel(注意,它可能有更多的代码,而不是将这些代码分成不同的ViewModels

好处

  • 您将所有这3个屏幕包含在1个ViewModel
  • 没有任何新视图模型的更多示例
  • 您可以使用ViewModel在这3个屏幕之间共享数据/通信

缺点

  • 它可能会使您的ViewModel因大量代码而膨胀(取决于您的情况)

另一种方法是每个组合对象有1个ViewModel,这样可以分隔逻辑,但这取决于您是否需要在它们之间通信数据。如果需要通信,则需要在每个屏幕的导航之间发送参数,并在相应的组合对象中激活ViewModels

相关问题