Uri 构造函数

Uri(
  1. {String? scheme,
  2. String? userInfo,
  3. String? host,
  4. int? port,
  5. String? path,
  6. Iterable<String>? pathSegments,
  7. String? query,
  8. Map<String, dynamic>? queryParameters,
  9. String? fragment}
)

从其组件创建一个新的 URI。

每个组件都通过一个命名字段设置。可以提供任意数量的组件。可以通过两个不同的命名字段之一来设置 pathquery 组件。

方案组件通过 scheme 设置。方案被规范化为全部小写字母。如果省略了方案或为空,则 URI 不会包含方案部分。

权限组件的用户信息部分通过 userInfo 设置。默认为空字符串,它将不会包含在 URI 的字符串表示中。

权限组件的宿主部分通过 host 设置。宿主可以是主机名、IPv4 地址或 IPv6 地址,包含在 '['']' 之间。如果宿主包含一个冒号字符,则会在未提供的情况下添加 '['']'。宿主被规范化为全部小写字母。

权限组件的端口部分通过 port 设置。如果省略了 port 或为 null,则表示 URI 方案的默认端口,并且与显式传递该端口号等价。识别的方案及其默认端口为 "http" (80) 和 "https" (443)。所有其他方案都视为默认端口为零。

如果提供了 userInfohostport 中的任何一个,则 URI 根据 hasAuthority 有权限。

路径组件通过 pathpathSegments 设置。当使用 path 时,它应该是一个有效的 URI 路径,但如果有必要,会转义无效的字符(除了通配符 ':/@[]?#')。反斜杠 \ 将被转换成斜线 /。当使用 pathSegments 时,每个提供的段首先进行百分号编码,然后使用正斜杠分隔符连接。

路径段的百分号编码除了未编码字符以外,还包括以下字符列表:!$&'()*+,;=:@。如果其他组件需要绝对路径,则如果尚未提供,将在前面添加一个开头的斜杠 /

查询组件通过 queryqueryParameters 进行设置。当使用 query 时,提供的字符串应该是有效的 URI 查询,但除了一般分隔符外的无效字符在需要时将被转义。当使用 queryParameters 时,查询从提供的映射中构建。映射中的每个键和值都会进行百分编码,并使用等号和 ampersand 符号连接。映射中的值必须是 null、字符串或字符串的 可迭代对象。一个可迭代对象对应同键的多个值,一个空的或 null 的可迭代对象对应该键没有值。

键和值的百分编码会编码所有字符,除了保留字符,并用 + 替换空格。如果 query 是空字符串,它与省略它等效。要有一个实际的空查询部分,请为 queryParameters 使用一个空的映射。

如果 queryqueryParameters 都未省略或为 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;