我正在开发一个像Gmail这样的应用程序。在纵向模式下,它只显示邮件列表作为应用程序的主屏幕,当用户点击一条邮件时,应用程序将导航到邮件详细信息屏幕。两个屏幕都有一个ViewModel:消息列表视图模型和消息详细视图模型。
在横向模式下,我想同时显示两个屏幕,彼此相邻:左侧为信息列表屏幕,右侧为所选信息的信息详细信息屏幕。
我的解决方案是,我创建一个路由的消息列表屏幕来处理不同的情况:
- 如果应用程序处于纵向模式且未选择任何消息,则只会显示消息列表屏幕
- 如果应用程序处于纵向模式并选择了消息,则应用程序将显示消息详细信息屏幕,而不是显示消息列表屏幕
- 如果应用程序处于横向模式,它将显示两个屏幕。
所以基本上我有一个组合函数来处理所有这些情况。我的问题是,在这个组合函数中有多个视图模型是一个好的实践吗?
2条答案
按热度按时间hyrbngr71#
这里不太可能有一个正确的答案,但根据状态持有者和UI状态:
**注意:**您应该只在目标级别的UI中使用
ViewModel
。您不应该在UI的可重用部分中使用它们,例如搜索栏或Chip组。在这些情况下,普通类更适合。听起来您这里有一个目标级UI,根据配置(横向/纵向)的不同,它有不同的外观。因此,听起来单个
ViewModel
更符合当前的指导方针。cnh2zyt32#
有一个更好的解决方案,例如,只有一个视图模型发出您需要的
uiStates
对于Portrait(未打开消息),您可以发出只包含消息列表的
uiState
对于Portrait(消息打开),您可以发出仅包含消息详细信息的
uiState
对于横向(显示两者),您可以发出包含消息详细信息+选定消息(在列表中选择)+消息列表的uiState
由于您没有提供任何代码,我对我的意思做了一个小的绘图,您可以只从
ViewModel
中emit
数据,然后在您的Activity / Fragment
中观察它,然后根据uiState传播并打开正确的可组合对象。您可以将这3个可组合对象包含在1中,但对于该**,您需要将3个uiState发送到该可组合对象**,并使用when语句决定打开哪个可组合对象。
我认为像这样分开这些屏幕会让它更干净,而且你不需要超过1
viewModel
。根据@fstanis的回答,是这样吗?没有正确的答案,这取决于你想遵循什么样的架构,以及你想如何做。
根据你的描述,你可以用两种方法
每件事都有一个
ViewModel
(注意,它可能有更多的代码,而不是将这些代码分成不同的ViewModels
)好处
ViewModel
中ViewModel
在这3个屏幕之间共享数据/通信缺点
ViewModel
因大量代码而膨胀(取决于您的情况)另一种方法是每个组合对象有1个
ViewModel
,这样可以分隔逻辑,但这取决于您是否需要在它们之间通信数据。如果需要通信,则需要在每个屏幕的导航之间发送参数,并在相应的组合对象中激活ViewModels