SwiftUI - ObservableObject 不会导致更新

SwiftUI - ObservableObject doesn't cause update

我有一个名为 SocialMealplan 的 class,如下所示:

public class SocialMealplan : Identifiable, ObservableObject {
    public var id : String {
        return owner.id
    }
    @Published public var owner : YKUser
    @Published public var mealplan : Mealplan
    
    init(owner : YKUser, mealplan : Mealplan) {
        self.owner = owner
        self.mealplan = mealplan
    }
}

然后我有以下代码:


struct MealPlanView: View {

    @ObservedObject var currentMealplan: SocialMealplan = SocialMealplan(owner: YKUser.none, mealplan: Mealplan.none)

    var body: some View {
    /* ... */

        ForEach(self.currentMealplan.mealplan.meals, id: \.self) { (meal) in
            VStack {
                NavigationLink(destination: SelectRecipeView(completion: self.updatedMealplan, date: meal.date)) {
                    MealplanRow(meal: .constant(meal))
                }
            }
        }.onAppear {
            self.refreshMealplan()
        }

    /* ... */
    }

    func refreshMealplan() {
        // Get the mealplan from the server
        self.currentMealplan.mealplan = newMealplan
    }
}

问题是,当我 运行 这段代码获得膳食计划时,但当它尝试分配变量时没有任何反应。调用了 refreshMealplan 并分配了变量,但 UI 上没有任何变化,并且视图不会刷新以反映新数据。

(当我重新分配 owner 变量时也没有任何反应)

每次视图需要 redrawn/recreated 时,都会创建并初始化一个新的 SocialMealPlan 对象 currentMealPlan。因此,一个对象触发了更新(通过分配给已发布的变量之一),但新更新的视图引用了它自己新初始化的 currentMealPlan.

副本

选项 1:将 currentMealPlan 设为 @StateObject(这样代表一个州的一个副本将被保留和引用)。即@StateObject var currentMealplan = SocialMealplan(owner: YKUser.none, mealplan: Mealplan.none)

选项 2:或者保留 @ObservedObject,但在视图之前和视图之外创建它。但是,如果其他视图也需要引用currentMealPlan,请在视图之前创建一个并将其作为环境变量传递。即 MealPlanView().environmentObject(currentMealPlan) 然后在视图中 @EnvironmentObject var currentMealPlan: SocialMealPlan