簡體   English   中英

SwiftUI 可以將 ObservableObject 放入另一個 ObservableObject 中嗎?

[英]SwiftUI Is it ok to put an ObservableObject inside another ObservableObject?

我有一個名為PurchaseView的視圖。 此視圖顯示有關購買、購買的內容和購買者的詳細信息。 我正在做的是,在這個視圖中,我將ItemViewClientView都放在PurchaseView中。 ItemViewClientView是共享的,並且在我的應用程序的其他部分中使用。 他們有自己的 ViewModel。

我也嘗試將ItemViewModelClientViewModel放入PurchaseViewModel但我不知道是否可以將ObservableObject放入另一個ObservableObject 這是一個好方法還是ObservableObject內不應該有任何ObservableObject 以下哪一項更好?

這個?

class PurchaseViewModel: ObservableObject {
    let clientViewModel: ClientViewModel
    let itemsViewModel: ItemViewModel

    //
}

或這個?

struct PurchaseView: View {
    @ObservedObject var purchaseViewModel: PurchaseViewModel
    @ObservedObject var itemViewModel: ItemViewModel
    @ObservedObject var clientViewModel: ClientViewModel

    var body: some View {
        //
    }
}

購買 model:

class Purchase {
    let id: String
    let total: Double
    // ...
    var item: Item?
    var client: Client?
}

您的第一個解決方案將不起作用,因為對嵌套 ObservableObjects 的更改不會向上傳播:

class PurchaseViewModel: ObservableObject {
    let clientViewModel: ClientViewModel
    let itemsViewModel: ItemViewModel
    ...
}

可以在此處找到解決方法:如何告訴 SwiftUI 視圖綁定到嵌套的 ObservableObjects


您的第二種方法是正確的,並且適用於大多數情況:

struct PurchaseView: View {
    @ObservedObject var purchaseViewModel: PurchaseViewModel
    @ObservedObject var itemViewModel: ItemViewModel
    @ObservedObject var clientViewModel: ClientViewModel
    ...
}

如果您為多個視圖共享一個ObservableObject ,則可以將其注入環境並作為@EnvironmentObject訪問。


或者,您可以將嵌套的 ObservableObjects 設置為structs

class PurchaseViewModel: ObservableObject {
    @Published var clientViewModel: ClientViewModel // <- add `@Published`
    ...
}
struct ClientViewModel { // <- use `struct` instead of `class`
    ...
}

請注意,您的ClientViewModel將在每次它(或其任何屬性)更改時成為一個新結構 - 此解決方案不應過度使用(尤其是對於復雜的 ViewModel)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM