Introducción a las variables en Flutter: Los URIs


Avatar de Pedro Cortez

La clase Uri en Flutter es una herramienta poderosa y flexible para gestionar páginas web, realizar llamadas o acceder a otros recursos. En este artículo, exploraremos los diferentes tipos de URIs, sus usos y los métodos prácticos para manipularlos.


Flutter Variable Uri

¿Para qué sirve la clase Uri en Flutter?

En Dart, la variable Uri es una abstracción para los Identificadores Uniformes de Recursos (URIs). Un URI es una cadena de caracteres que identifica un recurso en una red, ya sea páginas web, archivos o servicios. Pueden ser de dos tipos principales: URLs (Localizadores Uniformes de Recursos) y URNs (Nombres Uniformes de Recursos).

A través de esta clase podrás acceder a recursos externos a tu aplicación, como páginas web, números de teléfono, etc.

¿Cómo se compone un URI?

Un URI se compone de varias partes, algunas de las cuales no son obligatorias:

  • Scheme (esquema): Indica el protocolo a utilizar (por ejemplo, http, https, ftp, file).
  • Authority (autoridad): Compuesta por el host (por ejemplo, un nombre de dominio) y el puerto.
  • Path (ruta): Indica el recurso específico al que se quiere acceder.
  • Query (consulta): Contiene parámetros adicionales en forma de pares clave-valor.
  • Fragment (fragmento): Hace referencia a una subsección del recurso.

Por ejemplo, un URI podría tener esta forma:

void main() {
  // Créer une URI à partir d'une chaîne
  var uri = Uri.parse('https://www.example.com:8080/path/to/resource?query=flutter#section1');
  
  // Afficher les différentes parties de l'URI
  print('Scheme: ${uri.scheme}'); // https
  print('Host: ${uri.host}'); // www.example.com
  print('Port: ${uri.port}'); // 8080
  print('Path: ${uri.path}'); // /path/to/resource
  print('Query: ${uri.query}'); // query=flutter
  print('Fragment: ${uri.fragment}'); // section1
}

Los diferentes tipos de URIs en Flutter

La clase Uri soporta diferentes tipos de recursos. A continuación se describen los principales tipos y cómo manejarlos.

URIs HTTP y HTTPS

El método Uri.https (o http) te permite acceder a recursos de tipo página web a través de los protocolos HTTP o HTTPS.

Los parámetros admitidos por este método son:

  • Scheme: http o https
  • Host: Nombre de dominio o dirección IP
  • Port (opcional): Número de puerto para la conexión
  • Path (opcional): Ruta del recurso en el servidor
  • Query Parameters (opcional): Pares clave-valor para enviar datos adicionales

Aquí un ejemplo de un URI de tipo HTTPS:

void main() {
  // URI HTTPS
  var uri = Uri.https('www.example.com', '/path/to/resource', {'query': 'flutter'});

  // Mostrar las diferentes partes del URI
  print('Scheme: ${uri.scheme}'); // https
  print('Host: ${uri.host}'); // www.example.com
  print('Path: ${uri.path}'); // /path/to/resource
  print('Query: ${uri.query}'); // query=flutter
}

URIs de Archivo

El método Uri.file te permite acceder a archivos locales almacenados en tu dispositivo, a través de su ruta absoluta en el sistema de archivos local.

Los parámetros admitidos por este método son:

  • Scheme: file
  • Path: Ruta absoluta del archivo en el sistema de archivos local

Aquí un ejemplo de un URI de archivo:

void main() {
  // URI de archivo
  var uri = Uri.file('/path/to/local/file.txt');

  // Mostrar las diferentes partes del URI
  print('Scheme: ${uri.scheme}'); // file
  print('Path: ${uri.path}'); // /path/to/local/file.txt
}

URIs de teléfono

La clase Uri también te permite almacenar números de teléfono que luego se pueden utilizar para realizar llamadas. Para esto, debes usar el método Uri.parse.

Los parámetros admitidos por este método son:

  • Scheme: tel
  • Path: Número de teléfono

Aquí un ejemplo de un URI de teléfono:

void main() {
  // URI de teléfono
  var uri = Uri.parse('tel:+1234567890');

  // Mostrar las diferentes partes del URI
  print('Scheme: ${uri.scheme}'); // tel
  print('Path: ${uri.path}'); // +1234567890
}

URIs de Mailto

La clase Uri también puede usarse para almacenar información de un correo electrónico prellenado, que luego puedes utilizar en una aplicación de mensajería.

Los parámetros admitidos por este método son:

  • Scheme: mailto
  • Path: Dirección de correo electrónico
  • Query Parameters (opcional): Pares clave-valor para prellenar el asunto, cuerpo, etc.

Aquí un ejemplo de un URI de mailto:

void main() {
  // URI de mailto
  var uri = Uri(
    scheme: 'mailto',
    path: 'example@example.com',
    queryParameters: {
      'subject': 'Hello',
      'body': 'How are you?'
    }
  );

  // Mostrar las diferentes partes del URI
  print('Scheme: ${uri.scheme}'); // mailto
  print('Path: ${uri.path}'); // example@example.com
  print('Query: ${uri.query}'); // subject=Hello&body=How+are+you%3F
}

URIs de datos

Finalmente, la clase Uri seguida del método dataFromString() te permite almacenar datos codificados, como por ejemplo para recuperar imágenes o archivos.

Los parámetros admitidos por este método son:

  • Scheme: data
  • MIME Type: Tipo MIME de los datos
  • Encoding (opcional): Codificación de los datos (base64)
  • Datos: Datos codificados

Aquí un ejemplo de un URI de datos:

void main() {
  // URI de datos codificados
  var uri = Uri.dataFromString(
    'Hello, Flutter!',
    mimeType: 'text/plain',
    encoding: Encoding.getByName('utf-8')
  );

  // Mostrar las diferentes partes del URI
  print('Scheme: ${uri.scheme}'); // data
  print('Content: ${uri.data}'); // Data: text/plain;base64,SGVsbG8sIEZsdXR0ZXIh
}

Métodos útiles asociados a los URIs

Aquí te presento algunos métodos que puedes utilizar con los URIs, que pueden resultarte útiles en tus proyectos con Flutter.

toString()

El método .toString() es bien conocido y permite convertir tu URI en una cadena de caracteres completa. Esto puede ser útil si, por ejemplo, necesitas mostrarlo en un texto.

void main() {
  var uri = Uri.https('www.example.com', '/path/to/resource', {'query': 'flutter'});
  print(uri.toString()); // https://www.example.com/path/to/resource?query=flutter
}

toFilePath()

El método .toFilePath() convierte un URI de archivo en una ruta de archivo local. Es útil cuando trabajas con URIs de archivos y necesitas obtener la ruta del archivo en el sistema de archivos local.

void main() {
  // URI de archivo con caracteres especiales
  var uri = Uri.parse('file:///C:/path%20with%20spaces/file.txt');
  print(uri.toFilePath(windows: true)); // C:\path with spaces\file.txt
}

replace()

El método .replace() te permite crear una nueva instancia de un URI, reemplazando una parte del mismo. Esto te permite modificar parámetros u otras partes específicas de un URI sin tener que recrearlo por completo.

void main() {
  var uri = Uri.https('www.example.com', '/path/to/resource', {'query': 'flutter'});
  var newUri = uri.replace(queryParameters: {'query': 'dart'});
  print(newUri.toString()); // https://www.example.com/path/to/resource?query=dart
}

resolve()

El método .resolve() te permite crear un URI relativo a partir de un URI base. Esto puede ser útil para crear varias variantes a partir de una misma raíz.

void main() {
  var baseUri = Uri.https('www.example.com', '/path/to/');
  var relativeUri = Uri.parse('resource?query=flutter');
  var resolvedUri = baseUri.resolveUri(relativeUri);
  print(resolvedUri.toString()); // https://www.example.com/path/to/resource?query=flutter
}

Conclusión

Ahora que conoces las variables más utilizadas con Flutter y cómo declararlas, el siguiente paso será aprender a manipularlas y modificarlas usando operadores:

Avatar de Pedro Cortez