Volver a la página principal
jueves 31 octubre 2024
7

Cómo usar noSuchMethod en Dart

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.

¿Qué es 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.

Ejemplo básico de uso de 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.

Ejemplo avanzado de 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.

Ventajas de 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.

Etiquetas:
dart
Compartir:
Creado por:
Author photo

Jorge García

Fullstack developer