【问题标题】:how to navigate view from ouside response function using NavigationView in swiftui?如何在 swiftui 中使用 NavigationView 从外部响应功能导航视图?
【发布时间】:2021-12-15 06:06:40
【问题描述】:

我正在使用 NavigationView 从一个视图导航到另一个视图。在按钮操作上,我想浏览另一个页面。我使用了多个网络调用来检查和导航另一个页面。

我有两个功能。一种是doLogin。如果我在 doLogin 方法中 isActiveWelcomeView = true,它会导航到 WelcomeView。它工作正常。但是当我在 onResponse 函数中使用 isActiveWelcomeView = true 时,它​​不会导航到 WelcomeView。 onResponse 是协议函数,我实现了 FundTransferDashboard 视图和服务器数据来到 onResponse 函数。我必须检查此功能的所有验证,然后导航到另一个页面。

这里是示例代码..

struct FundTransferDashboard: View ,LoginProtocol{
                
                @State private var isActiveWelcomeView = false
                
                
                var body: some View {
                    
                    ZStack(alignment: .top) {
                        
                        
                        NavigationView {
                            VStack {
                                
                                Button(action: {
                                    
                                    doLogin()
                                    
                                }) {
                                    HStack {
                                        
                                        Image("lock")
                                            .resizable()
                                            .frame(width: 50, height: 50, alignment: .leading)
                                            .padding(10)
                                        
                                        
                                        Text("LOGIN")
                                            .padding(.leading, 40)
                                            .foregroundColor(.white)
                                            .font(.system(size: 25, weight: Font.Weight.bold))
                                            .padding(10)
                                        
                                        Spacer()
                                    }
                                    Spacer()
                                } .frame(maxWidth: .infinity)
                                
                                
                                NavigationLink("", destination:  WelcomeView(), isActive: $isActiveWelcomeView)
                            }
                            
                        }
                    }
                    
                }
                func doLogin(){
                    //calling  network
                }
                func onResponse(loginResponse: LoginResponseModel){
                   //reponse....
                isActiveWelcomeView = true
                }
            }

这是协议

    protocol LoginProtocol {
      func onResponse(loginResponse:LoginResponseModel)
   }

我使用@State 从一个视图导航到另一个视图。代码有什么问题?请帮帮我

【问题讨论】:

    标签: swift swiftui


    【解决方案1】:

    您编写的代码似乎运行良好。但是,如果您在影响结果的doLogin 方法中执行异步工作会产生副作用,这不会让我感到惊讶。通常,您不应在 View 中执行异步工作,而是将其移至 ObservableObject。例如:

    protocol LoginProtocol {
        func onResponse(loginResponse:LoginResponseModel)
    }
    
    class FundTransferDashboardViewModel : ObservableObject, LoginProtocol {
        @Published var isActiveWelcomeView = false
        
        func doLogin(){
            //mock an async call
            DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
                self.onResponse(loginResponse: LoginResponseModel())
            }
        }
        func onResponse(loginResponse: LoginResponseModel){
            //reponse....
            isActiveWelcomeView = true
        }
    }
    
    struct FundTransferDashboard: View{
        @StateObject private var viewModel = FundTransferDashboardViewModel()
        var body: some View {
            
            ZStack(alignment: .top) {
                NavigationView {
                    VStack {
                        Button(action: {
                            viewModel.doLogin()
                        }) {
                            Text("Login")
                        }
                        NavigationLink("", destination:  Text("Welcome"), isActive: $viewModel.isActiveWelcomeView)
                    }
                }
            }
        }
    }
    

    【讨论】:

    • @Enamul 这回答了你的问题吗?
    猜你喜欢
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    • 2020-06-03
    • 2021-08-09
    • 2020-04-11
    相关资源
    最近更新 更多