Saltar al contenido

¿Puedo aplicar la interpolación de cadenas de Dart de forma dinámica?

Solución:

(publicado por Bill Hesse)

Al envolver el literal de cadena en una función que toma el contexto como parámetro, puede tener una Función: contexto -> Cadena que puede pasar en lugar de una Cadena. Si necesita utilizar algunas operaciones String, como concat, en estos objetos, puede implementar estas operaciones en una clase que encapsule este tipo (“levantándolas”). Esta parece una forma sencilla de dar la cadena literal en un lugar y proporcionar los datos que desea interpolar en otro.

La interpolación de cadenas siempre ocurre dinámicamente, cada vez que se usa el literal, y los datos pueden provenir fácilmente de un parámetro a una función en lugar del contexto léxico.

Por ejemplo:

Function MyTemplate() {
   return (Context context) {
     return "<table><tr><td class=${context.leftColumnClass}>Red Sox</td><td>${context.data}</td></tr></table>";
   }
}

var templateHere = MyTemplate();

var output = templateHere(context);

También puede omitir un nivel de indirección y simplemente crear

String FillMyTemplate(Context context) => '''
    <html><head><title>$context.title</title></head>
''';

y use FillMyTemplate donde necesite la plantilla.

(publicado por Sam McCall)

Hay un truco que involucra noSuchMethod():

class Template {
  var _context;

  noSuchMethod(method, args) {
    if (!method.startsWith("get:")) return super.noSuchMethod(method, args);
    return _context[method.substring(4)];
  }

  abstract String template();

  String evaluate(context) {
    _context = context;
    try {
      return template();
    } finally { _context = null; }
  }
}

Y luego crea una subclase:

class MyTemplate extends Template { template() => """
  <title>$title</title>
  <h1>$title</h1>
""";}

¡Finalmente, úsala!

final renderedText = new MyTemplate().evaluate({"title": "Hello, world"})
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *