SwiftUI:LazyVStack 不更新

And*_*tto 2 ios swift swiftui

我的应用程序有一个ScrollView内部LazyVStack

内部采用DailyEventsForEach数组:

struct DailyEvents: Equatable, Identifiable {
    var id: String {
        dayString + "\(events.count)"
    }
    let day: Date
    let events: [EventInfo]

    var isToday: Bool {
        day.isToday()
    }

    var dateString: String {
        DateFormatter.dayMonthDateFormtter.string(from: day)
    }

    var dayString: String {
        isToday ? "today".localized : DateFormatter.dayDateFormtter.string(from: day)
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,每次我在数组中添加新的DailyEventsLazyVStack时,都会正确更新。

但是,如果我在已经存在的DailyEvents的 events 属性中添加新的EventInfo。看不到更新,也不会重新加载。LazyVstack

如果我切换LazyVstack为 a VStack,一切正常。

用户界面:

@ObservedObject var viewModel: ViewModel
var scrollViewProxy = ScrollViewProxyManager()
@SwiftUI.State private var isBackToTodayVisible = false

private var events: [DailyEvents] {
  viewModel.dailyEvents.value ?? []
}
var eventsList: some View {
            ZStack(alignment: .bottom) {
                ScrollView {
                    ScrollViewReader { proxy in
                        LazyVStack(alignment: .center, spacing: 0) {
                            Spacer()
                                .frame(height: 16)
                            ForEach(events, id: \.id) { dailyEvent in
                                makeDailyEvents(dailyEvent)
                            }
                        }
                        .onAppear {
                            scrollViewProxy.setProxy(proxy: proxy)
                        }
                    }
                }
                if isBackToTodayVisible {
                    scrollTodayButton
                        .padding(.bottom, 16)
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

Tej*_*ina 6

在 SWIFTUI 中,除了 UIKit UITableView 的 reloadData() 方法之外,没有其他方法可以重新加载列表/LazyStack 数据。

我遇到了完全相同的问题,即数据源更新时 List 或 LazyVStack UI 未更新。[这里数据源应该是 @ObservedObject/@State]

我使用了一个简单的技巧来解决这个问题——为视图分配一个唯一的 ID,如下所示。

List(items, id: \.self) {
   Text($0.name)
}
.id(UUID())
Run Code Online (Sandbox Code Playgroud)

LazyVStack 的示例:

LazyVStack {
  ForEach(items, id: \.self) { item in
    Text(item.name)
  }
}
.id(UUID())
Run Code Online (Sandbox Code Playgroud)