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
时,查询从提供的映射中构建。映射中的每个键和值都会进行百分编码,并使用等号和 ampersand 符号连接。映射中的值必须是 null
、字符串或字符串的 可迭代对象。一个可迭代对象对应同键的多个值,一个空的或 null
的可迭代对象对应该键没有值。
键和值的百分编码会编码所有字符,除了保留字符,并用 +
替换空格。如果 query
是空字符串,它与省略它等效。要有一个实际的空查询部分,请为 queryParameters
使用一个空的映射。
如果 query
和 queryParameters
都未省略或为 null
,则 URI 没有查询部分。
片段组件通过 fragment
设置。它应该是一个有效的 URI 片段,但除了一般分隔符之外的无效字符在需要时将被转义。如果省略了 fragment
或为 null
,则 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: '[email protected]',
queryParameters: {'subject': 'Example'});
print(mailtoUri); // mailto:[email protected]?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;