在 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 无效,如果为真则重绘MainViewDelayedLaunchScreen

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

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

如果这不能解决问题,则必须在 MainView 以及如何使用 userState 绘制视图或在 if session.session 中做一些事情(也许您可以添加更多代码回答你的问题)。

【讨论】:

您好!感谢您的评论,目前,使用 functionResult = true,而不是 .toggle(),视图不会弹回 MainView,但 ProfileView 中的内容在重新启动应用程序之前不会更新。任何想法如何解决这个问题?谢谢!

以上是关于在 swiftui 中构建用户模型的主要内容,如果未能解决你的问题,请参考以下文章

在 SwiftUI 中从 Observable 视图模型初始化 Map

编写 SwiftUI 模型以从带有数组的 JSON 文件中读取

Swiftui + 核心位置:地图无法以用户为中心

SwiftUI TextEditor - 编辑完成后保存状态

SwiftUI + Combine:如何将数据分配给带有动画的模型

如何让 SwiftUI 动态响应用户事件?