Flutter中如何通过GoRouter获取含子域名的完整路径URL用于深度链接?
获取子域名与完整路径的实现方案
1. Web端直接从浏览器环境拿取
Web环境下,域名信息存在浏览器的window.location对象里,用dart:js直接调用就能拿到:
import 'dart:js' as js; // 获取完整域名(含子域名) String getCurrentDomain() { return js.context['location']['host'].toString(); } // 获取完整URL,方便后续解析 String getFullUrl() { return js.context['location']['href'].toString(); }
在GoRouter的路由页面里,你可以把这个域名和GoRouterState的subloc(当前路径)拼接成需要的*.domain.com/path格式。
2. 多平台通用(处理Deep Link/App Link场景)
如果是移动端或桌面端,用户通过链接打开App的场景,用uni_links插件监听跳转链接,从完整URL里解析域名和路径:
import 'package:uni_links/uni_links.dart'; // 初始化监听Deep Link Future<void> setupDeepLinkListener() async { // 处理App启动时的初始链接 final initialLink = await getInitialLink(); if (initialLink != null) { _parseLink(initialLink); } // 处理App运行中收到的链接 linkStream.listen((link) { if (link != null) { _parseLink(link); } }); } // 解析链接,提取域名和路径 void _parseLink(String link) { final uri = Uri.parse(link); final domain = uri.host; // 拿到子域名+主域名,比如sub.domain.com final path = uri.path; // 拿到路径,比如/path final fullTarget = '$domain$path'; // 拼接成需要的格式 // 把fullTarget存到全局状态(比如Provider、Riverpod)里,供GoRouter页面调用 }
之后在GoRouter的页面组件里,直接从全局状态取这个拼接好的字符串就行,不用依赖GoRouterState的路径信息。
3. 结合GoRouter传递域名信息
可以在初始化GoRouter时,把提前获取到的域名通过extra参数传给路由,或者直接在路由builder里调用获取方法:
final goRouter = GoRouter( routes: [ GoRoute( path: '/path', builder: (context, state) { final domain = getCurrentDomain(); // 或者从全局状态取 final fullPath = '$domain${state.subloc}'; return YourPage(fullPath: fullPath); }, ), ], );
内容的提问来源于stack exchange,提问作者Flutter_user
相关产品推荐
相关产品推荐

