为什么 Dart Uri 用“+”替换空格?

Gun*_*ack 3 dart flutter

我正在使用 Urilauncher 插件来打开邮件客户端。这是我的代码

final Uri _emailLaunchUri = Uri(
                  scheme: 'mailto',
                  path: 'info@moops.in',
                  queryParameters: {'subject': 'Feedback for Moops'});

await launch(_emailLaunchUri.toString());
Run Code Online (Sandbox Code Playgroud)

但是,在电子邮件客户端中。主题中的空格被“+”符号取代。我已经尝试用 %20 替换空格,然后空格被这些字符替换。我是否应该使用其他特殊字符来避免使用 + 符号并使用空格代替。或者也许是一种逃离空间的方法。

Sha*_*nty 5

我找到了绕过这个问题的解决方案。

    Uri _emailLaunchUri = Uri(
         scheme: 'mailto',
         path: 'example@example.com',
         queryParameters: {
         'subject': 'Example Subject & Symbols are allowed!'
         }
    });
              
    launch(
       _emailLaunchUri.toString().replaceAll("+", "%20")
    );
Run Code Online (Sandbox Code Playgroud)

replace all 函数用代表空格的 %20 替换所有 + 符号,这完美地解决了这个问题。


fay*_*eed 2

您可以使用字符串文字来解决这个问题,我在下面编写了一个小函数来处理这个问题:

String getUrl(String scheme, String path, Map<String, String> queryParameters) {
  String url = '$scheme:$path?';

  queryParameters.forEach((String k, String v){
    url += '$k=$v&';
  });

  return url;
}
Run Code Online (Sandbox Code Playgroud)

然后你可以这样称呼它:

await launch(getUrl('mailto', 'info@moops.in', {'subject': 'Feedback for Moops'}));
Run Code Online (Sandbox Code Playgroud)