Flutter中如何通过DeepLink跳转至指定页面?
解决Flutter Deeplink唤起App后无法跳转指定页面的问题
核心问题分析
- GoRouter配置中,
email_screen和reset_screen的path均设置为/,路由系统无法区分,默认只会匹配第一个路由,导致始终打开EmailScreen。 - 未配置GoRouter处理DeepLink的跳转逻辑,无法解析唤起App的链接并导航到对应页面。
分步解决方案
1. 修正路由路径冲突
给两个路由设置唯一的path,避免冲突:
- 保留
email_screen的path: '/'作为首页路径 - 给
reset_screen设置path: '/reset'作为专属路径
2. 配置GoRouter解析DeepLink
通过以下方式让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
相关产品推荐
相关产品推荐

