recursion - 我使用 dislousreGroup 作为递归,但视图更新无法正常工作。有什么办法吗?
问题描述
如果在折叠后更改数据,则视图被重用并绘制得很奇怪。
在 swiftUI 中重用视图似乎会产生这些结果。
我可以控制视图的重用吗?还是有其他方法?
跟身份证有关系吗?
下面是实现这一点的代码。
import SwiftUI
@main
struct TestApp: App {
var item: Item = dummyItems
var item2: Item = dummyItems2
@State var isChange: Bool = true
var body: some Scene {
WindowGroup {
VStack {
List {
if isChange {
ContentView(item: item)
} else {
ContentView(item: item2)
}
}
Button("change") {
isChange.toggle()
}
}
}
}
}
import SwiftUI
struct ContentView: View {
let item: Item
init(item: Item) {
self.item = item
}
var body: some View {
ForEach(item.children) { item in
if item.children.isEmpty {
Text("\(item.title)")
} else {
DisclosureGroup(
isExpanded: item.$isExpanded,
content: {
ContentView(item: item)
},
label: { Text("\(item.title)") }
)
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
let item: Item = dummyItems
ContentView(item: item)
}
}
struct Item: Identifiable {
var id: UUID = UUID()
@Binding var isExpanded: Bool
var title: String = "title"
var children: [Item] = []
init(title: String,
children: [Item]) {
self.title = title
self.children = children
self._isExpanded = .constant(true)
}
}
let dummyItems2 = Item(title: "root",
children: [
Item(title: "1",
children: [
Item(title: "1-1",
children: [
Item(title: "1-1-1",
children: [])]
),
Item(title: "1-2",
children: [
Item(title: "1-2-1",
children: []),
Item(title: "1-2-2",
children: [])]
)
]),
Item(title: "2",
children: [
Item(title: "2-1",
children: [
Item(title: "2-1-1",
children: [])]
),
Item(title: "2-2",
children: [
Item(title: "2-2-1",
children: [])]
),
Item(title: "2-3",
children: [
Item(title: "2-3-1",
children: [])]
),
]),
Item(title: "3",
children: [
Item(title: "3-1",
children: [
Item(title: "3-1-1",
children: []),
Item(title: "3-1-2",
children: []),
Item(title: "3-1-3",
children: [])]
),
Item(title: "3-2",
children: [
Item(title: "3-1-1",
children: [])]
),
Item(title: "3-3",
children: [
Item(title: "3-1-1",
children: [])]
)
])
])
let dummyItems = Item(title: "root",
children: [
Item(title: "1",
children: [
Item(title: "1-1",
children: [
Item(title: "1-1-1",
children: [])]
),
Item(title: "1-2",
children: [
Item(title: "1-2-1",
children: []),
Item(title: "1-2-2",
children: [])]
)
]),
Item(title: "2",
children: [
Item(title: "2-1",
children: [
Item(title: "2-1-1",
children: [])]
),
]),
Item(title: "3",
children: [
Item(title: "3-1",
children: [
Item(title: "3-1-1",
children: []),
Item(title: "3-1-2",
children: []),
Item(title: "3-1-3",
children: [])]
),
Item(title: "3-2",
children: [
Item(title: "3-1-1",
children: [])]
),
Item(title: "3-3",
children: [
Item(title: "3-1-1",
children: [])]
)
])
])
任何帮助将不胜感激。
解决方案
尝试以下
List {
if isChange {
ContentView(item: item)
} else {
ContentView(item: item2)
}
}
.id(isChange) // << here !!
推荐阅读
- c# - 如何在 Linux 上为 .NET Core 编译 Windows.Forms 应用程序?
- css - 使下拉的宽度更大
- flutter - 添加此包失败(flutter_native_splash ^1.2.0 和flutter_launcher_icons 0.7.3,版本解析失败。)
- node.js - 将 process.stdin 数字文件描述符转换为 FileHandle?
- asp.net-mvc - 如何知道客户端应用程序发布到 API 的数据是否是原始的/未更改的
- reactjs - 无线电输入卡 - React + Antd
- node.js - Webpack / Vue.js:使用 ESM 依赖项在编译时生成模块代码
- python - 将索引 n 处的 pandas 数据帧列与索引 nk 处同一数据帧中的另一列相乘的有效方法
- python - 我不能在 python 上使用 plotly
- protocol-buffers - 逐字段读取 Protobuf 消息数据