SwiftUI Fatal error: No ObservableObject of type found
SwiftUI Fatal error: No ObservableObject of type found
我想在我的应用程序中有一个单一的点,我可以在其中存储一些数据并快速访问它。在 SwiftUI 之前,我只有 ApplicationDelegate
用于此目的。在我只需要调用某种 appDelegate.userService
之前,它为我提供了应用程序中的一个点,该点已初始化一次。完全没有更多的单身人士只是 appDelegate。
现在我发现了这个tutorial如何使用@EnvironmentObject
我在这里添加了这段代码来初始化我的用户服务:
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
var userService = UserService()
...
我也有这段代码:
struct LoginView: View {
@EnvironmentObject var userService: UserService
var body: some View {
...
在上面LoginView
我有一个通过电子邮件从服务器获取用户的功能:
func fetchUser(with email: String) {
userService.getUser(with: email) { (result) in
switch result {
case .success(let user):
self.userService.user = user // update user in user service after fetch
self.showWelcomeView = true
break
case .failure:
break
}
self.showActivityIndicator = false
}
}
但是当我尝试调用 getUser
函数时出现此错误:
Fatal error: No ObservableObject of type UserService found.
A View.environmentObject(_:) for UserService may be missing as an ancestor of this view.: file /BuildRoot/Library/Caches/com.apple.xbs/Sources/Monoceros_Sim/Monoceros-39.4.3/Core/EnvironmentObject.swift, line 55
2020-04-18 23:52:41.774988+0300 BusinessTool[7426:730172] Fatal error: No ObservableObject of type UserService found.
A View.environmentObject(_:) for UserService may be missing as an ancestor of this view.: file /BuildRoot/Library/Caches/com.apple.xbs/Sources/Monoceros_Sim/Monoceros-39.4.3/Core/EnvironmentObject.swift, line 55
这是我的用户服务:
class UserService: ObservableObject {
enum UserFetchResult {
case success(data: User)
case failure
}
typealias UserServiceResponse = (User?, NSError?) -> Void
@Published var user = User(username: "", email: "")
...
主要问题是如何解决上面的问题?
我还有一些补充问题:
- 我是否需要设置这个环境单例对象 (
@EnvironmentObject
) 还是像以前一样使用 AppDelegate 更好 appDelegate.userService
并将所有需要的数据存储在那里,我没有看到任何优势这件事。
- 如果有一些优势,我需要做一个用户服务,因为
ObservableObject
对我来说,用户服务更多的是执行一些功能(获取用户数据,更新服务器上的用户数据,在本地存储等)而不是我们需要观察的数据模型层。在这里一头雾水。在我上面提供的 link 中,Paul 使用此 ObservableObject
进行应用程序设置,不确定是否正确。
- 在我的示例中,我尝试从服务器获取用户并在获取后在用户服务中更新用户,这是正确或干净的设计代码还是我想多了?
在您的 SceneDelegate
中,您应该在根视图 (LoginView
) 上调用 .environmentObject(userService)
。
我想在我的应用程序中有一个单一的点,我可以在其中存储一些数据并快速访问它。在 SwiftUI 之前,我只有 ApplicationDelegate
用于此目的。在我只需要调用某种 appDelegate.userService
之前,它为我提供了应用程序中的一个点,该点已初始化一次。完全没有更多的单身人士只是 appDelegate。
现在我发现了这个tutorial如何使用@EnvironmentObject
我在这里添加了这段代码来初始化我的用户服务:
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
var userService = UserService()
...
我也有这段代码:
struct LoginView: View {
@EnvironmentObject var userService: UserService
var body: some View {
...
在上面LoginView
我有一个通过电子邮件从服务器获取用户的功能:
func fetchUser(with email: String) {
userService.getUser(with: email) { (result) in
switch result {
case .success(let user):
self.userService.user = user // update user in user service after fetch
self.showWelcomeView = true
break
case .failure:
break
}
self.showActivityIndicator = false
}
}
但是当我尝试调用 getUser
函数时出现此错误:
Fatal error: No ObservableObject of type UserService found.
A View.environmentObject(_:) for UserService may be missing as an ancestor of this view.: file /BuildRoot/Library/Caches/com.apple.xbs/Sources/Monoceros_Sim/Monoceros-39.4.3/Core/EnvironmentObject.swift, line 55
2020-04-18 23:52:41.774988+0300 BusinessTool[7426:730172] Fatal error: No ObservableObject of type UserService found.
A View.environmentObject(_:) for UserService may be missing as an ancestor of this view.: file /BuildRoot/Library/Caches/com.apple.xbs/Sources/Monoceros_Sim/Monoceros-39.4.3/Core/EnvironmentObject.swift, line 55
这是我的用户服务:
class UserService: ObservableObject {
enum UserFetchResult {
case success(data: User)
case failure
}
typealias UserServiceResponse = (User?, NSError?) -> Void
@Published var user = User(username: "", email: "")
...
主要问题是如何解决上面的问题?
我还有一些补充问题:
- 我是否需要设置这个环境单例对象 (
@EnvironmentObject
) 还是像以前一样使用 AppDelegate 更好appDelegate.userService
并将所有需要的数据存储在那里,我没有看到任何优势这件事。 - 如果有一些优势,我需要做一个用户服务,因为
ObservableObject
对我来说,用户服务更多的是执行一些功能(获取用户数据,更新服务器上的用户数据,在本地存储等)而不是我们需要观察的数据模型层。在这里一头雾水。在我上面提供的 link 中,Paul 使用此ObservableObject
进行应用程序设置,不确定是否正确。 - 在我的示例中,我尝试从服务器获取用户并在获取后在用户服务中更新用户,这是正确或干净的设计代码还是我想多了?
在您的 SceneDelegate
中,您应该在根视图 (LoginView
) 上调用 .environmentObject(userService)
。