简体   繁体   English

flutter + firebase 无密码 email 登录-动态链接数据返回 null

[英]flutter + firebase passwordless email login - dynamic link data returns null

I am trying to implement passwordless email login on my app.我正在尝试在我的应用程序上实现无密码 email 登录。 After the link has been clicked on, the app returns from the background but the dynamic link is null.点击链接后,应用从后台返回,但动态链接为null。

This is how I send the mail (with the right values for my app of course):这就是我发送邮件的方式(当然,我的应用程序具有正确的值):

user.sendSignInWithEmailLink(
      email: _email,
      androidInstallIfNotAvailable: true,
      iOSBundleID: "com.company.appname",
      androidMinimumVersion: "16",
      androidPackageName: "com.company.appname",
      url: "https://appname.page.link/email",
      handleCodeInApp: true);

I also added the intent as follows:我还添加了如下意图:

<intent-filter>
           <action android:name="android.intent.action.VIEW" />
           <category android:name="android.intent.category.DEFAULT" />
           <category android:name="android.intent.category.BROWSABLE" />

           <data android:host="appname.page.link" android:scheme="http"/>
           <data android:host="appname.page.link" android:scheme="https"/>
        </intent-filter>

Tried different variations with the intent, and non helped, including writing the firebase project url as the host like: project-name.firebaseapp.com有意尝试了不同的变体,但没有帮助,包括编写 firebase 项目 url 作为主机,如: project-name.firebaseapp.com

The data still comes back empty.返回的数据仍然是空的。

Any thoughts?有什么想法吗? am I missing something?我错过了什么吗?

I've updated the firebase_dynamic_links package to the latest version (0.5.0+9), while using the configuration below and it starts working.我已将firebase_dynamic_links包更新到最新版本 (0.5.0+9),同时使用以下配置并开始工作。

Sending sign-in link configuration:发送登录链接配置:

firebaseAuth.sendSignInWithEmailLink(
        email: email,
        url: "https://mydemoapp.page.link/email",
        androidInstallIfNotAvailable: true,
        androidMinimumVersion: '21',
        androidPackageName: 'com.example.mydemoapp'
        handleCodeInApp: true,
        iOSBundleID: 'com.example.mydemoapp');

AndroidManifest.xml intent-filter configuration: AndroidManifest.xml意图过滤器配置:

    <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
        <category android:name="android.intent.category.LAUNCHER"/>
    </intent-filter>
    <intent-filter>
        <data android:host="mydemoapp.page.link" android:scheme="https"/>
        <data android:host="mydemoapp.page.link" android:scheme="http"/>
    </intent-filter>

Getting a dynamic link in Flutter.在 Flutter 中获取动态链接。

The example comes form from https://pub.dev/packages/firebase_dynamic_links该示例来自https://pub.dev/packages/firebase_dynamic_links

If your app did not open from a dynamic link, getInitialLink() will return null .如果您的应用程序不是从动态链接打开的,则getInitialLink()返回 null That's the reason why you have to FirebaseDynamicLinks.instance.onLink implemented in case the app is already opened.这就是为什么你必须在应用程序已经打开的情况下实现FirebaseDynamicLinks.instance.onLink的原因。

void main() {
  runApp(MaterialApp(
    title: 'Dynamic Links Example',
    routes: <String, WidgetBuilder>{
      '/': (BuildContext context) => MyHomeWidget(), // Default home route
      '/helloworld': (BuildContext context) => MyHelloWorldWidget(),
    },
  ));
}

class MyHomeWidgetState extends State<MyHomeWidget> {
  .
  .
  .
  @override
  void initState() {
    super.initState();
    this.initDynamicLinks();
  }

  void initDynamicLinks() async {
    final PendingDynamicLinkData data = await FirebaseDynamicLinks.instance.getInitialLink();
    final Uri deepLink = data?.link;

    if (deepLink != null) {
      Navigator.pushNamed(context, deepLink.path);
    }

    FirebaseDynamicLinks.instance.onLink(
      onSuccess: (PendingDynamicLinkData dynamicLink) async {
        final Uri deepLink = dynamicLink?.link;

        if (deepLink != null) {
          Navigator.pushNamed(context, deepLink.path);
        }
      },
      onError: (OnLinkErrorException e) async {
        print('onLinkError');
        print(e.message);
      }
    );
  }
  .
  .
  .
}

The mydemoapp.page.link must be added to Authorized domains in Firebase console mydemoapp.page.link必须添加到 Firebase 控制台中的授权域

appname.page.link还是appname.page.link/email您只需指定一封电子邮件即可实现

If coming to this answer in March 2022, this error is happening again and it's a bug on Flutterfire.如果在 2022 年 3 月得到这个答案,这个错误又会发生,这是 Flutterfire 上的一个错误。

Here is the issue with a Pull Request that hasn't been merged yet. 这是尚未合并的合并请求的问题

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM