如何在swiftui中使用NavigationView从外部响应函数导航视图?



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

我考虑了两个函数。一个是doLogin。如果我isActiveWelcomeView = true在doLogin方法中,它导航到WelcomeView。它工作得很好。但是当我在onResponse中使用isActiveWelcomeView = true时函数时,不能导航到WelcomeView。onResponse是我实现的协议函数。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从一个视图导航到另一个视图。代码有什么问题?请帮帮我

您的代码,正如所写的,似乎工作良好。但是,如果您在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)
}
}
}
}
}

相关内容

  • 没有找到相关文章

最新更新