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

Flutter中如何通过DeepLink跳转至指定页面?

解决Flutter Deeplink唤起App后无法跳转指定页面的问题

核心问题分析

  • GoRouter配置中,email_screen和reset_screen的path均设置为/,路由系统无法区分,默认只会匹配第一个路由,导致始终打开EmailScreen。
  • 未配置GoRouter处理DeepLink的跳转逻辑,无法解析唤起App的链接并导航到对应页面。

分步解决方案

1. 修正路由路径冲突

给两个路由设置唯一的path,避免冲突:

  • 保留email_screen的path: '/'作为首页路径
  • 给reset_screen设置path: '/reset'作为专属路径

通过以下方式让GoRouter识别唤起链接并导航到目标页面:

方式一:初始化时设置初始路由

在main函数中获取启动时的DeepLink地址,将其设为GoRouter的初始路径:

import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';

void main() {
  // 获取启动时的DeepLink链接
  Uri initialUri = Uri.base;
  String initialPath = '/';

  // 解析链接,匹配重置页面规则
  if ((initialUri.scheme == 'http' && initialUri.host == 'aaaa.com' && initialUri.path == '/reset') ||
      (initialUri.scheme == 'aaaa' && initialUri.path == '/reset')) {
    initialPath = '/reset';
  }

  runApp(MyApp(initialPath: initialPath));
}

class MyApp extends StatelessWidget {
  final String initialPath;

  const MyApp({super.key, required this.initialPath});

  @override
  Widget build(BuildContext context) {
    return MaterialApp.router(
      title: 'MyApp',
      theme: ThemeData(
        useMaterial3: true,
        colorScheme: ColorScheme.fromSeed(
          seedColor: const Color.fromRGBO(26, 49, 60, 1),
        ),
      ),
      routerConfig: GoRouter(
        initialLocation: initialPath,
        routes: [
          GoRoute(
            path: '/',
            name: 'email_screen',
            pageBuilder: (context, state) => const MaterialPage(child: EmailScreen()),
          ),
          GoRoute(
            path: '/reset',
            name: 'reset_screen',
            pageBuilder: (context, state) => const MaterialPage(child: ResetScreen()),
          ),
        ],
      ),
    );
  }
}

// 示例页面
class EmailScreen extends StatelessWidget {
  const EmailScreen({super.key});

  @override
  Widget build(BuildContext context) => Scaffold(appBar: AppBar(title: const Text('Email Page')));
}

class ResetScreen extends StatelessWidget {
  const ResetScreen({super.key});

  @override
  Widget build(BuildContext context) => Scaffold(appBar: AppBar(title: const Text('Reset Page')));
}

方式二:使用GoRouter内置DeepLink规则(推荐)

直接在路由中配置DeepLink匹配规则,自动识别链接跳转:

GoRouter router = GoRouter(
  routes: [
    GoRoute(
      path: '/',
      name: 'email_screen',
      pageBuilder: (context, state) => const MaterialPage(child: EmailScreen()),
    ),
    GoRoute(
      path: '/reset',
      name: 'reset_screen',
      pageBuilder: (context, state) => const MaterialPage(child: ResetScreen()),
      // 配置DeepLink匹配规则
      deepLink: deepLink(
        schemes: ['http', 'aaaa'],
        host: 'aaaa.com',
        path: '/reset',
      ),
    ),
  ],
);

3. 验证DeepLink格式

确保邮件链接符合以下格式:

  • HTTP链接:http://aaaa.com/reset
  • 自定义Scheme链接:aaaa://reset

测试方法

可通过adb命令快速测试DeepLink:

adb shell am start -W -a android.intent.action.VIEW -d "http://aaaa.com/reset" com.your.package.name

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 07:53:19