gpt4 book ai didi

swiftui - 在 ObservableObject 中引用 EnvironmentObject

转载 作者:行者123 更新时间:2023-12-03 14:15:50 26 4
gpt4 key购买 nike

我有一个 LoginView,如果用户未登录,则显示 RegisterView,如果用户已登录,则显示 ContentView:

struct LoginView: View {
@EnvironmentObject var userManager: UserManager
var body: some View {
Group {
if userManager.isRegistered {
ContentView()
} else {
RegisterView()
}
}
}
}
ContentView有三个 ObservedObject属性,它使用 combine 从带有 rest api 的服务器获取内容。
struct ContentView: View {
@EnvironmentObject var userManager: UserManager
@ObservedObject var usersStore = UsersStore()
@ObservedObject var rolesStore = RolesStore()
@ObservedObject var elementsStore = ElementsStore()

var body: some View {
NavigationView {
ZStack {
Image("stell")
.resizable()
.aspectRatio(contentMode: .fit)
.opacity(0.1)

VStack(alignment: .leading, spacing: 5) {
NavigationLink(destination: UsersView(usersStore: usersStore) ) {
Text("Users")
}
NavigationLink(destination: RolesView(rolesStore: rolesStore)) {
Text("Roles")
}
NavigationLink(destination: ElementsView(elements: $elementsStore.elements)) {
Text("Elements")
}
}.font(.title).padding(20)
}.navigationBarTitle(Text("STELL"))
}
}
}

我的问题是我想引用 userManager来自任何观察到的对象,例如当其余 api 返回 401 Unauthorized当 session token 过期时。然后我希望 ObservedObject 设置 isRegistered userManager 中的标志至 false所以 RegisterView会自动显示。但我该怎么做呢?我无法设置对 userManager 的引用在任何 ObservedObject 属性初始化器中,因为编译器提示属性初始化器在 self 之前运行可用。

最佳答案

在这种情况下,我将通过构造函数使用依赖注入(inject)...下面是 UsersStore 示例的可能方法, 对于其他人来说是一样的
UsersStore 的变化

class UsersStore: ObservableObject {
var manager: UserManager

init(manager: UserManager) { // << inject UserManager via constructor
self.manager = manager
}
...
}
ContentView 的变化
struct ContentView: View {
@EnvironmentObject var userManager: UserManager
@ObservedObject var usersStore: UsersStore

init(usersStore: UsersStore) {
self.usersStore = usersStore // << inject UsersStore via contructor
}

使用方式的变化
struct LoginView: View {
@EnvironmentObject var userManager: UserManager
var body: some View {
Group {
if userManager.isRegistered {
// userManager is valid here some UsersStore can be created
ContentView(usersStore: UsersStore(manager: self.userManager))

关于swiftui - 在 ObservableObject 中引用 EnvironmentObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60017564/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com