【问题标题】:Template file evaluation in flutterFlutter中的模板文件评估
【发布时间】:2020-06-11 14:24:52
【问题描述】:

我正在从我的代码中的字符串变量中的文件加载一些文本。此文本具有某些值,必须从地图动态填写。当我在代码中直接使用 String 时,它可以正常工作。但是当从文件中加载相同的字符串时,它不会执行所需的字符串插值。

考虑这个用于字符串插值 -

  String parseText(Map<String, dynamic> ctx){
    return "My name is ${ctx['employee'].name} and I joined today, ${ctx['today']}";
  }

这适用于正确的员工姓名和日期。但是当我从文件中加载这个字符串时(从文件中加载的字符串本身可以正常工作) - 文本返回而不替换,请参阅 -

  String parseText(Map<String, dynamic> ctx){
    String text = getTextFromFile(String path); //working fine  
    // Can I do something here to get the text evaluated/interpolated correctly?    
    return text; //returns text as-it-is, without interpolation/evaluation
  }

我已经看到this solution in dart,它与我正在做的非常相似,但是当我用从文件中加载的字符串替换文本/字符串时,它不会执行必要的字符串插值。我是flutter 的新手,我在这里遗漏了一些明显的东西吗?

如何使用从文件加载的文本进行字符串插值?

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    字符串插值需要使用字符串文字。这基本上使它在编译时执行语法糖。您不能从任意 String 对象执行字符串插值,因为这将允许执行任意代码,这是一个安全漏洞。

    如果您需要从动态生成的模板生成字符串,则需要创建自己的解析器。

    【讨论】:

      【解决方案2】:

      这是我从this answer 发现的 -

      字符串插值仅适用于硬编码字符串。

      然而,我发现模板包mustache 可以很好地处理这个问题,它应该可以帮助任何尝试使用flutter/dart 进行基于文件的字符串插值(实际上是template evaluation)的人。

      这个模板可以像这样存储在一个文件中(如果对象在上下文中填充为地图,点表示法适用于对象)-

      My name is {{employee.name}}, aged {{employee.age}} years, 
      and I joined today - {{today}}.
      

      上下文将是 -

      final ctx = {
         "employee": employee(),
         "today": getToday(),  //function call to get today's date
      };
      

      模板评估将是 -

      Template t = new Template(getFileText());
      print(t.renderString(ctx));
      

      我希望mustache 能帮助寻找类似解决方案的人。

      【讨论】: