【问题标题】:Building a userModel in swiftui在 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 部分,或者您也可以,但更重要的是,有必要查看这些部分如何组合在一起,以了解导致视图重新加载的原因。

标签: ios swift xcode swiftui


【解决方案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 中的内容在重新启动应用程序之前不会更新。任何想法如何解决这个问题?谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-09
  • 2020-01-31
相关资源
最近更新 更多