插值注释类中的字符串

时间:2015-01-31 14:10:07

标签: dart

我试图找到一种在注释中插入字符串的方法,因为注释类构造函数的参数必须是常量我必须跳过$,然后用'\$'替换'$' import 'dart:mirrors'; void main() { var c = new Chicken('aaaa','blue',99); var templateValue = (reflectClass(Chicken).metadata.where((a)=>a.reflectee.runtimeType == Template).first.reflectee as Template).value; print(interpolater.interpolate(c,templateValue)); } class Template{ final String value; const Template(this.value); } @Template('<div>name:\${context.name} color:\${context.color} age:\${context.age}</div>') class Chicken{ String name; String color; int age; Chicken(this.name,this.color,this.age); } class interpolater{ static String interpolate(Object context,String s){ s = s.replaceAll('\\\$', '\$'); return s; } } 每当我需要插值时,以下示例都阐明了我要做的事情

{{1}}

但它似乎无法发挥作用,无论如何做出类似的工作?

2 个答案:

答案 0 :(得分:2)

您需要将字符串包装在下面的templateStr函数中:

import 'dart:mirrors';

class Context {
  String name = "some name";
  String color = "some color";
  int age = 15;
}

void main() {
  var c = new Chicken('aaaa','blue',99);
  var templateValue = (reflectClass(Chicken).metadata.where((a)=>a.reflectee.runtimeType == Template).first.reflectee as Template).value(c);
  print(templateValue);
}

class Template{
  final Function value;
  const Template(this.value);
  String getValue(context) => value(context);
}

String templateStr(context) => '<div>name:${context.name} color:${context.color} age:${context.age}</div>';

@Template(templateStr)
class Chicken{
  String name;
  String color;
  int age;
  Chicken(this.name,this.color,this.age);
}

答案 1 :(得分:2)

字符串插值是Dart的语法部分,它在解析时被识别。

如果你拿一个字符串并替换&#34; \ $&#34;在&#34; $&#34;的字符串中,您将获得一个字符串&#34; $&#34;在里面。它不是编译时的插值,所以它现在不是插值。

您可以将字符串插值视为&#34; $ a foo $ b&#34;作为"" + a.toString() + " foo " + b.toString() + ""的简写。字符串插值是字符串表达式,但它本身不是字符串 - 每次评估时,它都会计算为 new 字符串。 (好吧,编译时常量字符串插值是运行时的字符串值,因为它只在编译时计算一次)。

如果你想制作一个在运行时填写的模板,那么你还必须制作填写的代码。

一种替代方法是不使用字符串,而是使用注释中的函数:

// Top-level function is compile-time constant.
myTemplate(context) => 
  '<div>name:${context.name} color:${context.color} age:${context.age}</div>';

@Template(myTemplate)
class Chicken {...}

然后你可以用与当前相同的方式从注释中提取函数,然后用鸡来调用它。这使用真正的字符串插值来构建字符串,并延迟评估,直到您有上下文可用。

(如果您有权注释课程,为什么不在课堂上添加方法。那么您不会需要镜像。或者如果您不想添加对象的方法,可能使其静态,然后使用镜像查找