Я попытался обновить environmentObject в моем URLSession.
Мой вид входа в систему.
struct LoginView: View {
@EnvironmentObject var env: Env
...
var body: some View {
Group {
if env.isLogin { // 2 but the env.isLogin is still false
UserView()
} else {
VStack {
...
Button(action: {
self.login(name: self.name, pass: self.pass)
}) {
Text("Login")
}
Text("isLogin: \(String(env.isLogin))")
}
.padding()
}
}
}
func login(name: String, pass: String) {
...
URLSession.shared.dataTask(with: request) { data, response, error in
if let data = data {
if let decodedResponse = try? JSONDecoder().decode(Response.self, from: data) {
DispatchQueue.main.async {
...
if ... {
self.env.isLogin = true
print(self.system.isLogin) // 1 output true
}
}
return
}
}
print("Fetch failed: \(error?.localizedDescription ?? "Unknown error")")
}.resume()
}
}
Мой стартовый вид.
class Env: ObservableObject {
@Published var isLogin: Bool = false
}
struct ContentView: View {
let env = Env()
var body: some View {
VStack {
if env.isLogin {
UserView()
} else {
LoginView()
}
}
.environmentObject(env)
}
}
Я могу убедиться, что уже обновил isLogin в true на месте 1
, но связанное свойство env не отвечает с ним на месте 2
.
Разрешение
Я создаю другое представление LoginToOtherView
и замените его ContentView.
struct LoginToOtherView: View {
@EnvironmentObject var env: Env
var body: some View {
Group {
if env.isLogin {
UserView()
}
}
}
}
// and in place 2.
if env.isLogin {
LoginToOtherView()
}