FirebaseDynamicLinks getInitialLink() 多次触发

sjs*_*sam 7 flutter firebase-dynamic-links

getInitialLink() 在第一次检索后继续提供有效的动态链接。这会导致用户不断被迫进入与深层链接关联的页面的循环。

\n
Running `flutter doctor --verbose` produced the below results.\n\n[\xe2\x9c\x93] Flutter (Channel stable, 1.20.4, on Mac OS X 10.15.6 19G2021, locale en-US)\n    \xe2\x80\xa2 Flutter version 1.20.4 at /Users/sjsam/Documents/Developement/flutter\n    \xe2\x80\xa2 Framework revision fba99f6cf9 (5 days ago), 2020-09-14 15:32:52 -0700\n    \xe2\x80\xa2 Engine revision d1bc06f032\n    \xe2\x80\xa2 Dart version 2.9.2\n\n \n[\xe2\x9c\x93] Android toolchain - develop for Android devices (Android SDK version 28.0.3)\n    \xe2\x80\xa2 Android SDK at /Users/sjsam/Library/Android/sdk\n    \xe2\x80\xa2 Platform android-29, build-tools 28.0.3\n    \xe2\x80\xa2 Java binary at: /Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java\n    \xe2\x80\xa2 Java version OpenJDK Runtime Environment (build 1.8.0_212-release-1586-b4-5784211)\n    \xe2\x80\xa2 All Android licenses accepted.\n\n[\xe2\x9c\x93] Xcode - develop for iOS and macOS (Xcode 11.7)\n    \xe2\x80\xa2 Xcode at /Applications/Xcode.app/Contents/Developer\n    \xe2\x80\xa2 Xcode 11.7, Build version 11E801a\n    \xe2\x80\xa2 CocoaPods version 1.9.0\n\n[\xe2\x9c\x93] Android Studio (version 3.6)\n    \xe2\x80\xa2 Android Studio at /Applications/Android Studio.app/Contents\n    \xe2\x80\xa2 Flutter plugin version 44.0.2\n    \xe2\x80\xa2 Dart plugin version 192.7761\n    \xe2\x80\xa2 Java version OpenJDK Runtime Environment (build 1.8.0_212-release-1586-b4-5784211)\n\n[\xe2\x9c\x93] Connected device (2 available)\n    \xe2\x80\xa2 AOSP on IA Emulator (mobile)       \xe2\x80\xa2 emulator-5554 \xe2\x80\xa2 android-x86 \xe2\x80\xa2 Android 9 (API 28) (emulator) # No issues here\n    \xe2\x80\xa2 Android SDK built for x86 (mobile) \xe2\x80\xa2 emulator-5556 \xe2\x80\xa2 android-x86 \xe2\x80\xa2 Android 8.0.0 (API 26) (emulator) # Issue happens here\n\n\xe2\x80\xa2 No issues found!\n
Run Code Online (Sandbox Code Playgroud)\n

下面给出了我的代码示例(主要是文档中给出的代码的副本)。

\n
 @override\n  void initState() {\n    super.initState();\n    this.initDynamicLinks();\n  }\n  void initDynamicLinks() async {\n    try {\n      FirebaseDynamicLinks.instance.onLink(onSuccess: (PendingDynamicLinkData dynamicLink) async {\n        var deepLink = dynamicLink?.link?.toString() ?? null;\n        if (null != deepLink ) {\n          var lastIndex = deepLink.lastIndexOf(RegExp(r'/'));\n          assert(lastIndex != -1, "Problematic Link");\n          var feedId = deepLink.substring(lastIndex + 1);\n          // get the required data using feedID\n          try {\n            await Navigator.of(this.context).pushNamedAndRemoveUntil(\n              DeliveryTakeOrder.page,\n              ModalRoute.withName(PAGENAME),\n              arguments: argumentsConstructor(/*Arguments Here*/),\n            );\n          } catch (e) {\n            if (!kReleaseMode) {\n              debugPrint(e.toString());\n            }\n          }\n        }\n      }, onError: (OnLinkErrorException e) async {\n        print('onLinkError');\n        print(e.message);\n      });\n    } catch (e, s) {\n      print(s);\n    }\n\n   // await FirebaseDynamicLinks.instance.\n      final PendingDynamicLinkData dynamicLink = await FirebaseDynamicLinks.instance.getInitialLink();\n\n    var deepLink = dynamicLink?.link?.toString() ?? null;\n    if (null != deepLink ) {\n      // A bit of reverse engineering here\n      var lastIndex = deepLink.lastIndexOf(RegExp(r'/'));\n      assert(lastIndex != -1, "Problematic Link");\n      var feedId = deepLink.substring(lastIndex + 1);\n     // get the required data using feedID\n      try {\n        await Navigator.of(this.context).pushNamedAndRemoveUntil(\n          DeliveryTakeOrder.page,\n          ModalRoute.withName(PAGENAME),\n          arguments: argumentsConstructor(/*Arguments Here*/),\n        );\n      } catch (e) {\n        if (!kReleaseMode) {\n          debugPrint(e.toString());\n        }\n      }\n    }\n  }\n
Run Code Online (Sandbox Code Playgroud)\n

在内联文档中,我看到以下评论。

\n
  /// Attempts to retrieve the dynamic link which launched the app.\n  ///\n  /// This method always returns a Future. That Future completes to null if\n  /// there is no pending dynamic link or any call to this method after the\n  /// the first attempt.\n  Future<PendingDynamicLinkData> getInitialLink() async {\n  //..\n  }\n
Run Code Online (Sandbox Code Playgroud)\n

因此,在getInitialLink()第二次到达时,它应该返回 a ,null但这里的情况并非如此。任何帮助表示赞赏。

\n

注意:在 Android API 级别 27 之前,都会出现此问题。

\n

sjs*_*sam 4

到目前为止,这是一个持续存在的问题,因为我可以从这里确认 我设法使用共享首选项 模块(暂时)解决了这个问题。

内部主要:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  SharedPreferences prefs = await SharedPreferences.getInstance();
  await prefs.setBool('just_opening', true);
  runApp(YourAppName());
}
Run Code Online (Sandbox Code Playgroud)

在内部initState(),检查持久值just_opening,调用initDynamicLinks然后将just_opening属性设置为false

SharedPreferences.getInstance().then((prefs) async{
  if(prefs.getBool('just_opening')){
    this.initDynamicLinks();
  }
  await prefs.setBool('just_opening', false);
});
Run Code Online (Sandbox Code Playgroud)

这确实看起来像一个丑陋的黑客,但它适用于 iOS 和 Android。

编辑

截至 2022 年 3 月 13 日,这个问题似乎仍然存在。更好的选择是使用静态变量来解决这个问题,正如@Pinolpier评论中提到的那样