Uri 构造函数
根据其组成部分创建一个新的 URI。
每个组成部分都通过命名参数设置。可以提供任意数量的组成部分。可以通过两种不同的命名参数之一设置 path 和 query 组成部分。
通过 scheme 设置方案组成部分。方案被规范化为全部小写字母。如果省略方案或为空,则 URI 不会包含方案部分。
通过 userInfo 设置授权组成部分的用户信息部分。它默认为空字符串,这将从 URI 的字符串表示中省略。
通过 host 设置授权组成部分的主机部分。主机可以是主机名、IPv4 地址或 IPv6 地址,包含在 '[' 和 ']' 中。如果主机包含一个冒号字符,则如果尚未提供,则添加 '[' 和 ']'。主机被规范化为全部小写字母。
通过 port 设置授权组成部分的端口号。如果省略 port 或为 null,它表示 URI 方案的默认端口,并且与明确传递该端口号等效。可识别的方案及其默认端口是 "http" (80) 和 "https" (443)。所有其他方案都视为默认端口为零。
如果提供任何 userInfo、host 或 port,则 URI 根据 hasAuthority 具有授权。
通过 path 或 pathSegments 设置路径组成部分。当使用 path 时,它应该是一个有效的 URI 路径,但除了一般分隔符 ':/@[]?#' 之外的不合法字符将根据需要转义。反斜杠 \ 将被转换为斜杠 /。当使用 pathSegments 时,每个提供的段首先进行百分编码,然后使用正斜杠分隔符连接。
路径段的百分编码将编码除非保留字符和以下列表中的字符之外的所有字符: !$&'()*+,;=:@。如果其他组成部分需要绝对路径,则如果尚未存在,将前置一个斜杠 /。
查询组件可以通过 query 或 queryParameters 设置。当使用 query 时,提供的字符串应该是一个有效的 URI 查询字符串,但必要时将无效字符(除通用分隔符外)进行转义。当使用 queryParameters 时,查询由提供的映射构建。映射中的每个键和值都进行百分编码,并用等号和和号连接。映射中的值必须是 null、字符串或一个 可迭代的字符串。一个可迭代对象对应于相同键的多个值,一个空的可迭代对象或 null 对应于该键没有值。
键和值的百分编码将编码所有字符(除未保留字符外),并用 + 替换空格。如果 query 是空字符串,则相当于省略它。要有一个实际的空查询部分,请使用空映射作为 queryParameters。
如果省略或 null 了 query 和 queryParameters,则 URI 没有查询部分。
片段组件通过 fragment 设置。它应该是一个有效的 URI 片段,但必要时将无效字符(除通用分隔符外)进行转义。如果省略或 null fragment,则 URI 没有片段部分。
示例
final httpsUri = Uri(
scheme: 'https',
host: 'dart.dev',
path: 'guides/libraries/library-tour',
fragment: 'numbers');
print(httpsUri); // https://dart.ac.cn/guides/libraries/library-tour#numbers
final mailtoUri = Uri(
scheme: 'mailto',
path: 'John.Doe@example.com',
queryParameters: {'subject': 'Example'});
print(mailtoUri); // mailto:John.Doe@example.com?subject=Example
实现
factory Uri(
{String? scheme,
String? userInfo,
String? host,
int? port,
String? path,
Iterable<String>? pathSegments,
String? query,
Map<String, dynamic /*String?|Iterable<String>*/ >? queryParameters,
String? fragment}) = _Uri;