Swiftui - Veri olarak bir environmentobject kullanarak bir visibleObject nasıl başlatabilirim?


9

Bunun içinde yaşadığımız bu cesur yeni SwiftUI dünyasında bir antipattern olup olmadığından emin değilim, ancak temelde, görünümlerimin arayabileceği bazı temel kullanıcı bilgileriyle bir @EnvironmentObject var.

Ayrıca bu görünüm için gerekli bazı verilere sahip bir @ObservedObject var.

Görünüm görüntülendiğinde, @ObservedObject başlatmak için @EnvironmentObject kullanmak istiyorum:

struct MyCoolView: View { 

    @EnvironmentObject userData: UserData
    @ObservedObject var viewObject: ViewObject = ViewObject(id: self.userData.UID)  

    var body: some View { 
            Text("\(self.viewObject.myCoolProperty)")
    } 
}

Ne yazık ki başlatmadan sonra kadar çevre değişkeni kendini çağıramıyorum:

"Özellik başlatıcısı içinde 'userData' örnek üyesi kullanılamaz; özellik başlatıcıları 'self' kullanılabilir olmadan önce çalışır."

İleride birkaç olası rota görebiliyorum, ama hepsi hack gibi hissediyorum. Buna nasıl yaklaşmalıyım?


Belki de yapıya bir özel eklemeyi deneyebilirsiniz init.
nayem

Bunu denedim ve biraz garip bir hata var: Property wrappers are not yet supported on local properties Temelde onun bir init yönteminde @ObservedObject oluşturamıyorum diyor.
snarik

Yanıtlar:


10

İşte yaklaşım (en basit IMO):

struct MyCoolView: View {
    @EnvironmentObject var userData: UserData

    var body: some View {
        MyCoolInternalView(ViewObject(id: self.userData.UID))
    }
}

struct MyCoolInternalView: View {
    @EnvironmentObject var userData: UserData
    @ObservedObject var viewObject: ViewObject

    init(_ viewObject: ViewObject) {
        self.viewObject = viewObject
    }

    var body: some View {
            Text("\(self.viewObject.myCoolProperty)")
    }
}

Bu harika. MyCoolView aslında ObservedObject ilan ettiğim 'ev' görünümüne bir çocuktu. Teşekkürler!
snarik

Peki ya ViewObject içindeki userData'yı her seferinde tamamen yeni bir ViewObject oluşturulmadan değiştirmek istiyorsanız?
BobiSad
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.