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

Flutter中如何从Firebase动态链接提取code、pageName参数

你存入deepLink变量的对象本身就是Dart标准库的Uri类型,不需要手动拆分URL字符串,直接调用内置属性就能安全提取查询参数,避免手写解析逻辑出现边界错误。

核心实现逻辑

Uri对象自带的queryParameters属性会自动解析?后拼接的所有键值对,自动处理URL编码,返回Map<String, String>格式的参数集合,直接按键名取值即可:

await Firebase.initializeApp();

final PendingDynamicLinkData? initialLink =
    await FirebaseDynamicLinks.instance.getInitialLink();

if (widget.initialLink != null) {
  final Uri deepLink = widget.initialLink!.link;
  // 提取目标参数
  final String? targetPageName = deepLink.queryParameters['pageName'];
  final String? verifyCode = deepLink.queryParameters['code'];

  // 增加参数合法性校验,避免链接被篡改、参数缺失导致业务异常
  if (targetPageName != null && verifyCode != null) {
    // 根据pageName做路由分发
    switch(targetPageName) {
      case 'emailActivationPage':
        // 跳邮箱激活页,传入code参数
        routeCubit.toEmailActivationPage(code: verifyCode);
        break;
      case 'forgotPasswordPage':
        routeCubit.toForgotPasswordPage(verifyCode, true);
        break;
      default:
        // 未知页面的兜底逻辑
        routeCubit.toPhoneNumberPage();
    }
  } else {
    // 参数缺失走默认入口
    routeCubit.toPhoneNumberPage();
  }
} else {
  routeCubit.toPhoneNumberPage();
}

注意事项

  • 不要使用字符串分割(比如按?、&切割字符串)的方式解析参数,遇到参数值带特殊字符、URL编码、多同键参数的场景很容易解析失败,Uri内置解析已经覆盖了所有标准URL的边界场景。
  • 提取到的参数默认是可空的String?类型,如果业务需要把code转为数字类型,使用int.tryParse(verifyCode ?? '')做转换即可,记得加转换失败的兜底逻辑。
  • 如果你的链接存在同一个参数名传多个值的场景,可以用deepLink.queryParametersAll属性,它会返回Map<String, List<String>>结构,能拿到同键对应的所有参数值,普通单值参数场景用queryParameters即可。

针对你给出的示例链接https://.........app?pageName=emailActivationPage&code=7075,上述代码提取到的targetPageName值为emailActivationPage,verifyCode值为7075,可直接传入后续业务逻辑使用。


内容的提问来源于stack exchange,提问作者Max

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 22:30:57