¿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: