在 swiftui 中构建用户模型
Posted
技术标签:
【中文标题】在 swiftui 中构建用户模型【英文标题】:Building a userModel in swiftui 【发布时间】:2021-10-23 17:18:00 【问题描述】:我的应用目前遇到问题。我将用户数据存储在 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)
内容视图:
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()
主视图:
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 中定义的吗?有没有其他方法可以在不引起问题的情况下做到这一点?任何想法为什么会发生这种情况?
谢谢大家!
【问题讨论】:
您可以编辑它以包含minimal reproducible example 吗?我可以自己用异步返回示例数据的东西替换 Firebase 部分,或者您也可以,但更重要的是,有必要查看这些部分如何组合在一起,以了解导致视图重新加载的原因。 【参考方案1】:看起来您的问题在于您如何构建 if
,这取决于 functionResult
布尔:
if (functionResult == true)
MainView(user: userState)
else
DelayedLaunchScreen(user: userState)
在您的session.getUserFromUID
中,您正在切换此状态属性,该属性随后使ContentView
无效,如果为真则重绘MainView
或DelayedLaunchScreen
。
基本上每次调用该函数(或者如果它是一个侦听器则触发该函数)时,您都会破坏之前呈现的内容。这或许可以解释为什么您似乎在导航堆栈中弹出。
您应该能够通过删除 functionResult
属性或仅使用一次来解决问题。
如果这不能解决问题,则必须在 MainView
以及如何使用 userState
绘制视图或在 if session.session
中做一些事情(也许您可以添加更多代码回答你的问题)。
【讨论】:
您好!感谢您的评论,目前,使用 functionResult = true,而不是 .toggle(),视图不会弹回 MainView,但 ProfileView 中的内容在重新启动应用程序之前不会更新。任何想法如何解决这个问题?谢谢!以上是关于在 swiftui 中构建用户模型的主要内容,如果未能解决你的问题,请参考以下文章
在 SwiftUI 中从 Observable 视图模型初始化 Map
编写 SwiftUI 模型以从带有数组的 JSON 文件中读取
SwiftUI TextEditor - 编辑完成后保存状态