为什么intl.Message需要包含在封闭函数中?

时间:2017-10-13 22:55:05

标签: dart

这里有一个建议的使用Intl.message的模式我到处都看到了:

final String learnMoreLabel = _learnMoreLabel; String get
_learnMoreLabel => Intl.message('Learn more',
    name: 'HelpContentBase__learnMoreLabel',
    desc: 'The label for a link or button which takes the user to the '
        'Google Help Center to read more information on a topic.');

为什么我不能写:

final String learnMoreLabel = Intl.message('Learn more',
    name: 'HelpContentBase__learnMoreLabel',
    desc: 'The label for a link or button which takes the user to the '
        'Google Help Center to read more information on a topic.');

为什么需要将其包裹在吸气剂中?我在the docs中找到了这个:

  

将此选项用于将为不同区域设置翻译的消息。   预期的用法是在封闭函数内部   只返回此调用的值并为其提供范围   将在消息中替换的变量。

但它没有说为什么

1 个答案:

答案 0 :(得分:2)

简短的回答是,对于那个例子,它可能是这样编写的,但是当信息有参数时会崩溃。

Intl消息的作用是预处理器在程序上运行并查找Intl.message的所有出现并将它们写入文件。该文件被发送以进行翻译,然后翻译通过另一个程序运行并为每种语言生成Dart代码,可通过messages_all.dart导入访问。

当你在运行时调用Intl.message时,它会查找当前的语言环境(使用名称作为键)并委托给相应的翻译,传递任何参数(通过" args"参数)。

当评论说"提供范围"它实际上意味着允许在消息中使用的唯一事物是作为封闭函数的参数提供的变量。如果没有任何参数,我们可以允许省略封闭函数。这意味着使解析器足够智能以识别该模式。

顺便说一句:我不喜欢调用方法一次并分配给最终变量的模式。它在语言环境初始化和变量初始化之间设置潜在的竞争条件,这意味着语言环境不能在运行时更改。但是,我知道当我们有像Angular这样的框架调用它并比较每一帧的结果时,每次实际调用该函数都会花费很多。

另一个旁边:当没有参数时,您可以省略名称。它将使用文本作为名称。当存在参数时,文本是插值,因此它不能将其用作名称。