@Observable 模式与 SwiftUI 中的 FirebaseAuth

问题描述 投票:0回答:1

我想将我的 FireBase Auth 类转换为新的 (iOS17) @Observable 模式。旧模式(ObservableObject/EnviromentObject)有效。我在使用该模式时收到此错误消息。我很感激任何提示。

线程 1:“必须先配置默认的 FirebaseApp 实例,然后才能初始化默认的 Authinstance。确保这一点的一种方法是在 App Delegate 的 application(_:didFinishLaunchingWithOptions:) (或 @main 结构体的SwiftUI 中的初始化程序)。”

旧:

class Authentication : ObservableObject { ... } 

class AppDelegate: NSObject, UIApplicationDelegate {
    func application(_: UIApplication,
                     didFinishLaunchingWithOptions _: [UIApplication.LaunchOptionsKey: Any]? = nil) -> Bool
    {
        FirebaseApp.configure()
        return true
    }
}

@main
struct RApp: App {
    @UIApplicationDelegateAdaptor(AppDelegate.self) var delegate
    @StateObject var authentication = Authentication()

    var body: some Scene {
        WindowGroup {
            RootView()
                .environmentObject(authentication)
                .preferredColorScheme(.dark)
        }
    }
}

新:

@Observable
class Authentication { ... }

class AppDelegate: NSObject, UIApplicationDelegate {
    func application(_: UIApplication,
                     didFinishLaunchingWithOptions _: [UIApplication.LaunchOptionsKey: Any]? = nil) -> Bool
    {
        FirebaseApp.configure()
        return true
    }
}

@main
struct RApp: App {
    @UIApplicationDelegateAdaptor(AppDelegate.self) var delegate
    
    @State private var authentication: Authentication = Authentication()

    var body: some Scene {
        WindowGroup {
            RootView()
                .environment(authentication)
                .preferredColorScheme(.dark)
        }
    }
}
swiftui firebase-authentication
1个回答
0
投票

这是因为当

@State
结构初始化时,
= Authentication()
运行初始化器 RApp
立即
。这发生在
didFinishLaunchingWithOptions
之前。大概您在初始化程序中调用类似
Auth.auth()
之类的东西,这应该在
configure()
之后完成。

将此与

@StateObject
进行比较,后者稍后通过将其包装在
@autoclosure
中来运行初始化程序。

如果您想使用

@Observable
,您可以将
@State
放入
View
而不是
RApp
结构体中。这使得
Authentication
初始化程序运行得晚一些。

@main
struct RApp: App {
    @UIApplicationDelegateAdaptor(AppDelegate.self) var delegate

    var body: some Scene {
        WindowGroup {
            Wrapper()
        }
    }
}

struct Wrapper: View {
    @State var authentication = Authentication()

    var body: some View { 
        RootView() 
            .environment(authentication)
            .preferredColorScheme(.dark)
    }
}

或者,您可以尝试重构代码,这样就不会在

Auth.auth()
中调用
configure()
(或在
Authentication.init
之前无法调用的任何内容)。

无论如何,我认为你应该继续使用

ObservableObject
。它没有被弃用或任何东西。如果迁移到
@Observable
只会让您的生活变得更加困难,则无需迁移。

© www.soinside.com 2019 - 2024. All rights reserved.