ScrollView 中的 ForEach 在交互之前不会更新

ForEach in ScrollView not updating until interaction

添加到数组或从数组中删除时,除非用户与 ScrollView 交互,否则视图不会更新。

Model 是一个 ObservableObject,它在应用程序生命周期的早期被声明为 StateObject,然后作为 EnvironmentObject 传递。

数据只是一个带有对象数组的自定义 Profile 对象,添加到 store.profile!.tasks.append() 或从视图中删除时不会更新,除非用户滚动 ScrollView;我的意思是字面上的 1 个像素。

我试过的

代码

class Profile: Identifiable, Codable, Equatable
    var tasks: [Task]
}


struct Task: Identifiable, Codable, Equatable {
    var createdBy: String
    var title: String
    var date: Date
}

class Store : ObservableObject {
    @Published var profile: Profile?
}

struct ListView: View {

@EnvironmentObject var store: Store

  var body: some View {
     GeometryReader { geometry in
        ZStack(alignment: .bottomTrailing) {
          ScrollView(.vertical, showsIndicators: false){
              ForEach(store.profile!.tasks.filter({ return [=10=].createdBy == store.profile!.uid}).indices, id: \.self) { index in
                 NavigationLink(destination: DetailView().environmentObject(store)) {
                      TasksRow().id(UUID()) 
                 }
             }
          }
           .frame(maxWidth: geometry.size.width, alignment: .center)
           .frame(maxHeight: geometry.size.height)
           .background(Color.gray)
       }
    }
 }

您的 Profile 是引用类型,因此当您在其中附加任务时,对配置文件的引用不会更改,因此已发布不起作用。

改用配置文件的值类型(即 struct

struct Profile: Identifiable, Codable, Equatable
    var tasks: [Task]
}

现在将任务附加到配置文件将更改配置文件本身,发布者发送事件和视图将刷新。