swiftui - Swift:NavigationLink 多次调用目的地的 init 方法
问题描述
我有两个类 SubmitPhoneView 和 VerifyPhoneView。
出于某种原因,我注意到每当我在 SubmitPhoneView 的文本字段中输入一个数字时,它都会调用 VerifyPhoneView 的 init 方法。我希望它只被调用一次(当我按下 SubmitPhoneView 上的继续按钮时)
为什么会这样?
类 SubmitPhoneView:
import SwiftUI
import Firebase
struct SubmitPhoneView: View {
@State private var phoneNumber: String = ""
@State private var verificationID : String = ""
@State private var presentMe = false
var body: some View {
ZStack {
Text("My number is")
HStack(spacing: 20){
Text("+1")
TextField("Enter phone number", text: $phoneNumber)
.keyboardType(.numberPad)
}
VStack {
NavigationLink(destination: VerifyPhoneView(phoneNumber: $phoneNumber.wrappedValue, verificationID: $verificationID.wrappedValue), isActive: $presentMe) { EmptyView() }
Button(action: {
self.submitPhoneNumber()
self.presentMe = true
}) {
Text("Continue")
}
}
}
func submitPhoneNumber() {
PhoneAuthProvider.provider().verifyPhoneNumber("+1" + phoneNumber, uiDelegate: nil) { (verificationID, error) in
if error != nil {
print(error.debugDescription)
return
}
else {
self.verificationID = verificationID!
}
}
}
}
类验证电话视图:
import SwiftUI
import Firebase
struct VerifyPhoneView: View {
private var phoneNumber: String
@State private var verificationID: String
@State private var verificationCode: String = ""
@State private var loginSuccesful: Bool = false
@EnvironmentObject var ls: LoginStatus
@EnvironmentObject var currentUser: CurrentUser
init(phoneNumber: String, verificationID: String) {
print("the init method was called for VerifyPhoneView")
self.phoneNumber = phoneNumber
_verificationID = State(initialValue: verificationID)
print(self.verificationID)
}
var body: some View {
ZStack {
Text("My code is")
TextField("Enter code", text: $verificationCode)
Button(action: {
self.submitVerificationCode()
}) {
Text("Continue")
}
}
}
func submitPhoneNumber() {
// doesn't matter
}
func submitVerificationCode() {
// doesn't matter
}
}
}
解决方案
使用DeferView,如下
VStack {
NavigationLink(destination: DeferView {
VerifyPhoneView(phoneNumber: $phoneNumber.wrappedValue, verificationID: $verificationID.wrappedValue)
}, isActive: $presentMe) { EmptyView() }
Button(action: {
self.submitPhoneNumber()
self.presentMe = true
}) {
Text("Continue")
}
推荐阅读
- python - 使用 wtforms 生成的 Flask 按钮不触发 POST 请求
- asp.net-mvc - 实体框架为已删除模型生成表定义的迁移
- javascript - Cordova svg 抛出无法加载资源:net::ERR_FILE_NOT_FOUND [file:///android_asset/www/undefined]
- c# - 使用 Generated Soap WSDL 连接到 Tibco
- scala - 地图火花数据帧上的while循环
- css - 在 Laravel 5.8 中实现分页链接样式错误
- javascript - 当 Animated.View 有一个 Animated.ScrollView 作为孩子时,PanResponder 在 Android 上无法正常工作
- html - 如果我必须将文本拆分为多个 div,我将如何使 text-align 的行为方式与对单个文本的行为方式相同
- python - 使用 Keras fit_generator 训练后保存的模型无法正确给出预测
- java - 覆盖等于和等于之间有什么区别?