我想将我的 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)
}
}
}
这是因为当
@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
只会让您的生活变得更加困难,则无需迁移。