我正在使用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)
}
}
}
}
}