在swiftui中构建userModel



我目前遇到一个问题与我的应用程序。我存储用户数据在Firebase,当用户使用的应用程序,和一些细节在用户模型的变化,用户获得重定向到应用程序的根视图。我尝试创建一个可观察对象,但我认为我没有做得那么好。

目前,我获取用户的设置是这样的:

func fetchUsers(){
ref.child("users").observe(.childAdded) { (snapshot) in
guard let dictionary = snapshot.value as? [String: AnyObject]  else { return}
var user = UserData()

user.email = (dictionary["email"] as! String)
user.name = (dictionary["name"] as! String)
user.firstname = (dictionary["firstname"] as! String)
user.lastname = (dictionary["lastname"] as! String)
user.type = (dictionary["type"] as! String)
user.uid = (dictionary["uid"] as! String)
user.profileImageUrl = (dictionary["profileImageUrl"] as! String)
user.id = snapshot.key
user.fcmToken2 = (dictionary["fcmToken"] as! String)

self.users.append(user)

}
}

ContentView:

struct ContentView: View {
@EnvironmentObject var session : SessionStore
@State var userState = UserData()
@State private var functionResult = false
func getUser(){
DispatchQueue.main.async {
session.listen()
session.getUserFromUID { (fetcheduser) in
DispatchQueue.main.async {
self.functionResult.toggle()
self.userState = fetcheduser
print("Auth State Changed")
print(functionResult)

}
}

}
}
var body: some View {

VStack{
if (session.session != nil) {

if(functionResult == true){
MainView(user: userState)
}

else {
DelayedLaunchScreen(user: userState)
}

}

else{
HomeView()
}
}.onAppear{
getUser()
}
}
}

MainView:

UIKitTabView {
CandidateListView().tab(title: "Kandidatai", image: "person.2")
ChatsView(session: self.session).tab(title: "Žinutės", image: "message")
ChatsHomeView(session: self.session, user: self.user).environmentObject(session).tab(title: "Darbo skelbimai", image: "newspaper")
ProfileMenuView(session: self.session, user: self.user).tab(title: "Paskywra", image: "person")
//CreateJobView(user: session.getUserFrom(uid: session.uid), session: self.session).tab(title: "Paskywra", image: "person")
}

我猜问题是,在ContentView中,我有一个函数来获取用户数据,并通过一个虚假的启动屏幕延迟它。我真的不明白,为什么在数据库更改后,用户被弹出到根视图。这是因为用户是在ContentView中定义的吗?有没有其他方法可以做到这一点,而不会引起问题?知道为什么会这样吗?

谢谢你们了!

看起来您的问题是如何构建取决于functionResultifbool:

if (functionResult == true) {
MainView(user: userState)
} else {
DelayedLaunchScreen(user: userState)
}

在您的session.getUserFromUID中,您正在切换此状态属性,该属性随后使重新绘制MainView(如果为真)或DelayedLaunchScreenContentView无效。

基本上每次函数被调用(或者如果它是一个监听器则被触发)时,你都在破坏之前呈现的内容。这也许可以解释为什么你似乎在导航堆栈中被弹出。

您应该能够通过删除functionResult属性或只使用一次来解决这个问题。

如果这不能解决问题,必须在MainViewuserState如何用于绘制视图中做些什么,或者在if session.session中(也许您可以为您的问题添加更多代码)。

最新更新