You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 03:35:06