Flutter如何判断应用是否通过Deeplink启动?
Flutter冷启动时判断Deeplink唤起的解决方案
针对你遇到的冷启动时需校验条件再处理Deeplink跳转的需求,有两种常用方法可实现类似Firebase getInitialMessage()的效果:
方法1:使用WidgetsBinding.instance.getInitialRoute()
这个方法能直接获取冷启动时的初始路由路径,也就是Deeplink对应的路由名称,适合和你现有的onGenerateRoute配合使用。
实现步骤:
- 在应用启动初期(
runApp之前)调用该方法获取初始路由 - 执行自定义条件校验(比如用户登录状态检查)
- 根据校验结果决定最终的初始路由
代码示例:
void main() async { WidgetsFlutterBinding.ensureInitialized(); // 获取冷启动时的初始路由 String? initialDeepLinkRoute = WidgetsBinding.instance.getInitialRoute(); // 执行自定义校验逻辑,比如检查用户是否登录 bool isAuthenticated = await checkUserAuth(); // 根据校验结果确定初始路由 String targetRoute = isAuthenticated ? (initialDeepLinkRoute ?? '/welcome') : '/auth'; runApp(MyApp(initialRoute: targetRoute)); } class MyApp extends StatelessWidget { final String initialRoute; const MyApp({super.key, required this.initialRoute}); @override Widget build(BuildContext context) { return MaterialApp( initialRoute: initialRoute, onGenerateRoute: onGenerateRoute, ); } } // 你的原有onGenerateRoute方法 Route<dynamic> onGenerateRoute(RouteSettings settings) { WidgetBuilder builder; switch (settings.name) { case '/auth': builder = (BuildContext context) => AuthPage(); break; case '/code': builder = (BuildContext context) => CodePage(); break; case '/welcome': builder = (BuildContext context) => WelcomePage(); break; default: builder = (BuildContext context) => WelcomePage(); } return MaterialPageRoute( builder: (context) => builder(context), settings: settings, ); }
方法2:使用Uri.base获取完整Deeplink信息
如果你的Deeplink包含需要解析的参数(比如yourapp://code?token=xxx),可以通过Uri.base获取完整的Uri对象,解析其中的scheme、路径和参数。
代码示例:
void main() async { WidgetsFlutterBinding.ensureInitialized(); Uri initialUri = Uri.base; // 判断是否由自定义Deeplink唤起(替换成你的应用scheme) bool isDeeplinkLaunch = initialUri.scheme == 'yourapp'; String targetRoute = '/welcome'; if (isDeeplinkLaunch) { // 解析Deeplink的路径 String? deeplinkPath = initialUri.path; // 执行校验逻辑 bool isAuthenticated = await checkUserAuth(); targetRoute = isAuthenticated ? (deeplinkPath.isNotEmpty ? deeplinkPath : '/welcome') : '/auth'; } runApp(MyApp(initialRoute: targetRoute)); }
注意事项:
- 确保已正确配置Android和iOS的Deeplink权限与跳转逻辑
- 冷启动时
getInitialRoute()和Uri.base只会返回一次初始值,应用运行期间的Deeplink跳转仍由onGenerateRoute或路由监听处理
内容的提问来源于stack exchange,提问作者adminant
相关产品推荐
相关产品推荐

