sjs*_*sam 7 flutter firebase-dynamic-links
getInitialLink() 在第一次检索后继续提供有效的动态链接。这会导致用户不断被迫进入与深层链接关联的页面的循环。
\nRunning `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!\nRun 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 }\nRun 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 }\nRun Code Online (Sandbox Code Playgroud)\n因此,在getInitialLink()第二次到达时,它应该返回 a ,null但这里的情况并非如此。任何帮助表示赞赏。
注意:在 Android API 级别 27 之前,都会出现此问题。
\n到目前为止,这是一个持续存在的问题,因为我可以从这里确认 我设法使用共享首选项 模块(暂时)解决了这个问题。
内部主要:
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在本评论中提到的那样
| 归档时间: |
|
| 查看次数: |
2027 次 |
| 最近记录: |