我在聊天应用程序的常见场景中,会话列表由数据源驱动。
struct ConversationsView: View {
@ObservedObject var dataSource: ConversationsDataSource
...
var body: some View {
NavigationView {
List {
ForEach(dataSource.items) { item in
NavigationLink(destination: ChatView(conversationId: item.identifier)) {
Text(item.identifier)
}
}
}
}
}
}
我可以点击一个单元格,然后输入ChatView
,大致如下所示:
struct ChatView: View {
@ObservedObject var dataSource: ChatDataSource
...
var body: some View {
List {
ForEach(dataSource.messages) { message in
MessageView(message: message)
}
}
}
}
当我进入ChatView
并发送消息时,ConversationsDataSource
会更新。因此,将重新加载ConversationsView
的{{1}}并重新创建body
,我认为这对性能没有好处。而且由于这个原因,我在插入消息时没有任何动画。
是否可以避免在ChatView
更改时重新创建NavigationLink的目标视图?
在视图不可见时不重新加载ConversationsDataSource
的{{1}}并不是解决方案,因为在iPad的拆分视图中,对话列表和当前聊天同时打开。