gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 03:26:48 24 4
gpt4 key购买 nike

这是我在各处看到的使用 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.');

为什么需要将它包裹在getter中?我在 the docs 中找到了这个:

Use this for a message that will be translated for different locales. The expected usage is that this is inside an enclosing function that only returns the value of this call and provides a scope for the variables that will be substituted in the message.



但它没有说明原因。

最佳答案

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

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

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

当注释说“提供范围”时,它实际上意味着消息中唯一允许使用的是作为参数提供给封闭函数的变量。当没有任何参数时,我们可以允许省略封闭函数。这将意味着使解析器足够聪明以识别该模式。

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

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

关于dart - 为什么 intl.Message 需要包装在封闭函数中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46739048/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com