异步过程完成后是否在SwiftUI中关闭.sheet?
在调用异步进程以确认用户的MFA代码后,我试图在SwiftUI中关闭异步过程完成后是否在SwiftUI中关闭.sheet?,swiftui,amazon-cognito,aws-amplify,Swiftui,Amazon Cognito,Aws Amplify,在调用异步进程以确认用户的MFA代码后,我试图在SwiftUI中关闭.sheet。(我在用电话) 我在主视图上设置了一个绑定变量,并在工作表显示的视图中引用它,该视图带有@binding var displayMFAView:Bool。我有一个跟踪用户状态的身份验证帮助程序:@EnvironmentObject var userAuthHelper:userAuthHelper 以下代码按预期关闭工作表: func confirmMFACode(verificationCode: String)
.sheet
。(我在用电话)
我在主视图上设置了一个绑定变量,并在工作表显示的视图中引用它,该视图带有@binding var displayMFAView:Bool
。我有一个跟踪用户状态的身份验证帮助程序:@EnvironmentObject var userAuthHelper:userAuthHelper
以下代码按预期关闭工作表:
func confirmMFACode(verificationCode: String) {
// Code to confifm MFA...
print("User confirmed MFA")
self.userAuthHelper.isSignedIn = true
self.displayMFAView = false
}
但是,如果我通过Amplify的方法调用auth进程
这份工作表不会被驳回。我曾尝试在DispatchQueue.main.async{…
中包装变量赋值,但这也没有解决问题
...
DispatchQueue.main.async {
self.userAuthHelper.isSignedIn = true
self.displayMFAView = false
}
...
事实上,这会在我的日志中添加以下内容:
不允许从后台线程发布更改;请确保在模型更新时从主线程(通过receive(on:)等操作符)发布值。
将开关(…
包装在DispatchQueue
per中,在日志中给了我相同的警告
诚然,我对SwiftUI或AWS Amplify没有很好的理解。我不明白什么?从我可以看出,异步调用对状态变量做了一些意想不到的事情,但对EnvironmentObject没有。因此,我将
@Binding var displayMFAView:Bool
存储在EnvironmentObject中,
@EnvironmentObject var settings: UserSettings
@State var mfaCode: String = ""
然后可以通过更新对象中的布尔值来显示或隐藏.sheet(…
):
Button(action: {
self.signIn() // Async call happens here
self.settings.displayMFAView.toggle()
}) {
Text("Sign In")
}.sheet(isPresented: self.$settings.displayMFAView) {
// Example code to capture text
TextField("Enter your MFA code", text: self.$mfaCode)
}
Button(action: {
self.verifyMFACode(verificationCode: self.mfaCode) // async call
}) {
Text("Confirm")
}
在func verifyMFACode()
中,我可以进行异步调用以验证我的用户,然后切换工作表以在成功时消失:
func verifyMFACode(verificationCode: String) {
AWSMobileClient.default().confirmSignIn(challengeResponse: verificationCode) {
...
case .signedIn:
self.settings.displayMFAView.toggle()
...
我看不到你所有的代码,但你可能会发现我的答案对…很有帮助,似乎那里也有类似的东西。
func verifyMFACode(verificationCode: String) {
AWSMobileClient.default().confirmSignIn(challengeResponse: verificationCode) {
...
case .signedIn:
self.settings.displayMFAView.toggle()
...