我试图找到一种在注释中插入字符串的方法,因为注释类构造函数的参数必须是常量我必须跳过$
,然后用'\$'
替换'$'
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}}
但它似乎无法发挥作用,无论如何做出类似的工作?
答案 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 {...}
然后你可以用与当前相同的方式从注释中提取函数,然后用鸡来调用它。这使用真正的字符串插值来构建字符串,并延迟评估,直到您有上下文可用。
(如果您有权注释课程,为什么不在课堂上添加方法。那么您不会需要镜像。或者如果您不想添加对象的方法,可能使其静态,然后使用镜像查找