2017-10-13 16 views
1

ここで私はどこにでも見ているIntl.messageを使用しての推奨パターン: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

これは、異なるロケールで翻訳されるメッセージに使用してください。 これは囲み関数内にあり、 はこの呼び出しの値のみを返し、メッセージに代入される変数は の範囲になります。

なぜとは言いません。

答えて

2

簡単な答えは、その例ではおそらくそのように書くことができますが、メッセージへのパラメータがある場合は分解することです。

Intlメッセージでは、プリプロセッサがプログラム上で実行され、Intl.messageがすべて検出され、ファイルに書き込まれるということが起こります。そのファイルは翻訳用に送信され、翻訳は別のプログラムを介して実行され、messages_all.dartインポートを介して到達可能な各言語のDartコードが生成されます。

実行時にIntl.messageを呼び出すと、現在のロケール(キーとして名前を使用)が検索され、適切な変換に委譲され、(args引数を介して)任意のパラメータを渡します。

コメントに「範囲を指定する」と表示されている場合は、メッセージ内で使用できる唯一のものは、囲み関数の引数として提供される変数だけです。引数がなければ、囲み関数を省略することができます。それはパーサーもそのパターンを認識するのに十分スマートにすることを意味します。

私は一度メソッドを呼び出し、最後の変数に割り当てるパターンは大好きではありません。ロケールの初期化と変数の初期化の間に潜在的な競合条件が設定され、実行時にロケールを変更できないことを意味します。しかし、Angularのようなフレームワークを呼び出しているときには、そのフレームを呼び出す毎に実際に関数を呼び出すのに高価になるすべてのフレームで結果を比較することができます。

もう1つの脇に:パラメータがない場合は、名前を省略できます。テキストは名前として使用されます。パラメータがある場合、テキストは補間なので、名前として使用することはできません。

関連する問題