deeplink flutter 中如何传递参数?

问题描述 投票:0回答:1

我已经在我的 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));
    }
  }
}

如何路由到附加了特定参数的特定页面。

flutter deep-linking android-deep-link flutter-deep-link
1个回答
0
投票

我找到了解决问题的方法,而且它并不像我想象的那么难(至少在我得到解决方案之后没有)。无论如何,如果您设置了像上一问题中的深层链接处理程序,则必须检查要导航的路线。上面的代码设置是正确的,但它不适用于需要参数或参数的页面(因为没有地方处理此问题)。而你只需要调整_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
  }
© www.soinside.com 2019 - 2024. All rights reserved.