Firebase无密码身份验证如何与Flutter应用程序的动态链接一起使用?

时间:2020-08-25 23:31:50

标签: firebase flutter firebase-authentication

当我单击电子邮件中的验证链接时,它将打开我的应用程序在后台运行,但didChangeAppLifecycleState方法返回的数据为null,并且将FireLink中设置的deepLink返回为Firebase中设置的值,而不是电子邮件中的整个emailLink,导致SignInWithEmailAndLink按预期失败匹配从收到的链接在小部件中输入的电子邮件地址。

以下是本文https://medium.com/firebase-developers/dive-into-firebase-auth-on-flutter-email-and-link-sign-in-e51603eb08f8中的代码:-

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);
    });
  }
}
  1. handleLink方法
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(() {});
}
  1. 主要方法(初始化Firebase)
void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(MyApp());
}

注意:-Deeplink是一个扑朔迷离的概念,因此我在firebase中对其进行了随机设置。我的注册页面具有WidgetsBindingObserver,可帮助恢复应用程序生命周期状态。我的注册和登录代码在电子邮件小部件中,并且我没有使用表单来验证我的文本字段。

1 个答案:

答案 0 :(得分:0)

似乎您使用电子邮件链接登录后,在检查auth.SigninWithEMailLink()之前,firebase实例尚未更新,您需要像这样在firebase实例中对其进行更新

  var user= await auth.currentUser();
              await user.reload();
              user=await auth.currentUser();

如果您仍然遇到问题,请提供更多代码,以便我正确了解您的问题