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.