我已经在我的 flutter 应用程序上设置了深度链接,但我在传递和使用参数时遇到了麻烦。通常,深层链接适用于预定义的命名路由,假设我按下链接 https://domain/signup - 这会将用户重定向到我的 Flutter 应用程序上的注册页面。但这里的问题是,我无法传递参数,以便我可以使我的页面更加动态 - 假设用户按下链接 https://domain/course/:some-id - 我想重定向用户访问该特定课程页面。我相信我已经正确设置了深层链接 - 至少从我从 flutter 文档中看到的情况是这样。我正在使用命名路由,我知道它说使用路由器是首选方法 这是我的 AndroidXML 文件设置
<!-- Deep Links -->
<meta-data
android:name="flutter_deeplinking_enabled"
android:value="true"
/>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:scheme="scheme"
android:host="domain" />
</intent-filter>
<!-- App Links -->
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:scheme="https"
android:host="domain.com" />
<data
android:scheme="http" />
</intent-filter>
我制作了一个自定义深度链接处理程序 - 但它没有按照我想要的方式工作
class DeepLinkHandler {
static Future<void> initUniLinks(BuildContext context) async {
try {
// Get the initial deep link
final initialLink = await getInitialLink();
// Handle the initial deep link if it exists
_handleLink(initialLink, context);
// Listen for incoming deep links
linkStream.listen((String? link) {
_handleLink(link, context);
}, onError: (error) {});
} catch (error) {
throw Exception();
}
}
static void _handleLink(String? link, BuildContext context) {
if (link != null) {
final Uri deepLink = Uri.parse(link);
print('deeplink opened was $deepLink');
// This is where I want to navigate the user to the right page
}
}
static Future<void> openLink(String link) async {
if (await canLaunchUrl(Uri.parse(link))) {
await launchUrl(Uri.parse(link));
}
}
}
如何路由到附加了特定参数的特定页面。
我找到了解决问题的方法,而且它并不像我想象的那么难(至少在我得到解决方案之后没有)。无论如何,如果您设置了像上一问题中的深层链接处理程序,则必须检查要导航的路线。上面的代码设置是正确的,但它不适用于需要参数或参数的页面(因为没有地方处理此问题)。而你只需要调整_handleLink()方法即可。 这是我为导航到可能需要参数的页面所做的操作。
class DeepLinkHandler{
...
static void _handleLink(String? link, BuildContext context) {
if (link != null) {
final Uri deepLink = Uri.parse(link);
final String route = deepLink.pathSegments[0];
// Check for the route by using pathSegment (provided from
// uni_links in this case), and once you identify the route
// which is getting opened then you can navigate to it using
// simple if-statement
if (route == 'someRouteName') {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => SomePageEquivalentWithYourRouteName(
arg1: deepLink.pathSegments[1],
arg2: deepLink.pathSegments[2],
),
),
);
}
}
}
}
请注意,此解决方案要求您事先了解 URI 结构以及启动该 URI 时需要的参数。例如,如果您想从共享链接加载某些产品,那么您应该知道共享链接的结构。如果共享链接例如。是 /product/someProductId,那么你会做类似的事情
final String route = deepLink.pathSegments[0];
if(route=='product'){
//Navigate to the product page and also use .pathSegment[1] to get
//the necessary arg
}