El método noSuchMethod
en Dart permite manejar llamadas a métodos o accesos a propiedades que no existen en un objeto. Es una forma avanzada de interceptar estos intentos y reaccionar ante ellos, ya sea generando mensajes de error personalizados o implementando comportamientos dinámicos. Esto es útil en casos como proxies, clases dinámicas y pruebas.
noSuchMethod
en Dart?
noSuchMethod
es un método que se puede sobrescribir en una clase para interceptar llamadas a métodos o accesos a propiedades no definidos. Dart llama automáticamente a noSuchMethod
cuando se intenta usar un método o propiedad inexistente en un objeto. Este método recibe un único parámetro de tipo Invocation
, que contiene información sobre el método o propiedad que se intentó invocar.
Para que noSuchMethod
funcione, la clase debe implementar la interfaz dynamic
o incluir un método o propiedad que no está realmente implementado en la clase.
noSuchMethod
class Persona {
// Implementación de noSuchMethod para capturar llamadas a métodos no definidos
@override
void noSuchMethod(Invocation invocacion) {
print("Intentaste llamar a: ${invocacion.memberName}");
}
}
void main() {
var persona = Persona();
// Intento de llamar a un método inexistente
persona.saludar(); // Output: Intentaste llamar a: Symbol("saludar")
}
En este ejemplo, cuando se llama a persona.saludar()
, Dart invoca noSuchMethod
, ya que saludar()
no está definido en la clase Persona
. El método muestra un mensaje indicando el nombre del método inexistente.
noSuchMethod
para comportamiento dinámico
class ProxyDinamico {
final Map<String, dynamic> _datos = {};
// Permite almacenar valores para propiedades no definidas
@override
dynamic noSuchMethod(Invocation invocacion) {
if (invocacion.isGetter) {
var nombrePropiedad = invocacion.memberName.toString();
return _datos[nombrePropiedad];
} else if (invocacion.isSetter) {
var nombrePropiedad = invocacion.memberName.toString().replaceAll("=", "");
_datos[nombrePropiedad] = invocacion.positionalArguments.first;
}
}
}
void main() {
var proxy = ProxyDinamico();
proxy.nombre = "Ana"; // Setter dinámico
print(proxy.nombre); // Getter dinámico, Output: Ana
}
En este caso, ProxyDinamico
usa noSuchMethod
para interceptar y almacenar valores de propiedades no definidas en un mapa _datos
. Esto permite simular el comportamiento de una clase dinámica, donde se pueden definir propiedades de forma flexible.
noSuchMethod
1. Flexibilidad en el manejo de métodos y propiedades: Permite implementar proxies y manejar propiedades dinámicas.
2. Facilita el desarrollo de pruebas: Se puede utilizar para simular métodos en pruebas sin necesidad de definir todos los métodos reales.
3. Manejo de errores personalizado: Permite capturar y responder a llamadas no definidas con mensajes o acciones específicas.
Para más información, consulta la documentación oficial de Dart.
Jorge García
Fullstack developer