我可以动态应用Dart的字符串插值吗?

Set*_*add 7 dart

(来自Tristan McNab的Dart讨论邮件列表)

我正在尝试构建服务器端mvc框架并基于模板和诸如此类的东西生成视图,我想知道是否可以动态应用Dart的字符串插值.例如,这将是我的视图模板:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>${ViewData["Title"]}</title>
    <link href="/Content/css/site.css" rel="stylesheet" />
  </head>
  <body>
    <h1>${ViewData["Title"]}</h1>
    <div id="container">
      <p>Hello world!</p>
    </div>
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)

我想使用以下方法应用ViewData变量:

static String applyViewData(String html, Map ViewData) {
    // apply interpolation here
}
Run Code Online (Sandbox Code Playgroud)

目前这一切都可能吗?我搜索API表明它不是.

Set*_*add 6

(Bill Hesse发布)

通过将字符串文字包装在以上下文作为参数的函数中,您可以使用Function:context - > String,它可以传递而不是String.如果需要在这些对象上使用一些String操作(如concat),则可以在封装此类型的类上实现这些操作("提升"它们).这似乎是一种直接的方法,可以将字符串文字放在一个位置,并将要插入的数据放在另一个位置.

字符串插值总是动态地发生,每次使用文字时,数据很容易从参数传递到函数而不是从词汇上下文.

例如:

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

...

var templateHere = MyTemplate();
Run Code Online (Sandbox Code Playgroud)

...

var output = templateHere(context);
Run Code Online (Sandbox Code Playgroud)

您还可以跳过间接级别并创建

String FillMyTemplate(Context context) => '''
    <html><head><title>$context.title</title></head>
''';
Run Code Online (Sandbox Code Playgroud)

并在需要模板的地方使用FillMyTemplate.