flutter + firebase 无密码电子邮件登录 - 动态 link 数据 returns null

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

我正在尝试在我的应用程序上实现无密码电子邮件登录。 点击 link 后,应用程序 returns 从后台运行,但动态 link 为空。

这是我发送邮件的方式(当然我的应用程序使用正确的值):

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

我还添加了如下意图:

<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>

根据意图尝试了不同的变体,但没有帮助,包括编写 firebase 项目 url 作为主持人喜欢:project-name.firebaseapp.com

数据仍然是空的。

有什么想法吗?我错过了什么吗?

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

我已经将 firebase_dynamic_links 软件包更新到最新版本 (0.5.0+9), 在使用下面的配置时它开始工作。

正在发送登录link配置:

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>
        <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>

在 Flutter 中获取动态 link。

示例来自https://pub.dev/packages/firebase_dynamic_links

如果您的应用不是从动态 link 打开的,getInitialLink()return 为 null。这就是为什么您必须 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);
      }
    );
  }
  .
  .
  .
}

必须将 mydemoapp.page.link 添加到 Firebase 控制台中的授权域

如果在 2022 年 3 月得到这个答案,这个错误又会发生,这是 Flutterfire 上的一个错误。

Here is the issue 带有尚未合并的拉取请求。