当我单击电子邮件中的验证链接时,它将打开我的应用程序在后台运行,但didChangeAppLifecycleState方法返回的数据为null,并且将FireLink中设置的deepLink返回为Firebase中设置的值,而不是电子邮件中的整个emailLink,导致SignInWithEmailAndLink按预期失败匹配从收到的链接在小部件中输入的电子邮件地址。
1.didChangeAppLifecycleState方法
@override
void didChangeAppLifecycleState(AppLifecycleState state) async {
if (state == AppLifecycleState.resumed) {
final PendingDynamicLinkData data =
await FirebaseDynamicLinks.instance.getInitialLink();
if( data?.link != null ) {
handleLink(data?.link);
}
FirebaseDynamicLinks.instance.onLink(
onSuccess: (PendingDynamicLinkData dynamicLink) async {
final Uri deepLink `enter code here`= dynamicLink?.link;
handleLink(deepLink);
}, onError: (OnLinkErrorException e) async {
print('onLinkError');
print(e.message);
});
}
}
void handleLink(Uri link) async {
if (link != null) {
final User user = (await _auth.signInWithEmailAndLink(
email: _userEmail,
link: link.toString(),
))
.user;
if (user != null) {
setState(() {
_userID = user.uid;
_success = true;
});
} else {
setState(() {
_success = false;
});
}
} else {
setState(() {
_success = false;
});
}
setState(() {});
}
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(MyApp());
}
注意:-Deeplink是一个扑朔迷离的概念,因此我在firebase中对其进行了随机设置。我的注册页面具有WidgetsBindingObserver,可帮助恢复应用程序生命周期状态。我的注册和登录代码在电子邮件小部件中,并且我没有使用表单来验证我的文本字段。
答案 0 :(得分:0)
似乎您使用电子邮件链接登录后,在检查auth.SigninWithEMailLink()之前,firebase实例尚未更新,您需要像这样在firebase实例中对其进行更新
var user= await auth.currentUser();
await user.reload();
user=await auth.currentUser();
如果您仍然遇到问题,请提供更多代码,以便我正确了解您的问题