2017-10-13 1 views
1

Voici le un modèle suggéré pour l'utilisation Intl.message je l'ai vu partout:Pourquoi intl.Message doit-il être enveloppé dans une fonction englobante?

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.'); 

Pourquoi ne puis-je écrire simplement:

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.'); 

Pourquoi at-il besoin d'être enveloppé dans le getter? J'ai trouvé ceci dans the docs:

Utilisez ceci pour un message qui sera traduit pour différents lieux. L'utilisation attendue est que ce soit à l'intérieur d'une fonction d'enceinte que seulement renvoie la valeur de cet appel et fournit un champ d'application pour les variables qui vont être substitués dans le message.

mais il ne dit pas pourquoi.

Répondre

2

La réponse courte est que, pour cet exemple, il pourrait probablement être écrit de cette façon, mais il se décompose quand il y a des paramètres du message.

Qu'advient messages Intl est que l'un préprocesseur passe sur le programme et trouve toutes les occurrences de Intl.message et les écrit dans un fichier. Ce fichier est envoyé à la traduction, puis les traductions sont exécutées via un autre programme et génèrent du code Dart pour chaque langue, accessible via l'importation messages_all.dart. Lorsque vous appelez Intl.message à l'exécution, il recherche les paramètres régionaux actuels (en utilisant le nom comme clé) et délègue à la traduction appropriée, en passant les paramètres (via l'argument "args").

Lorsque le commentaire dit « fournit un champ », cela signifie vraiment que les seules choses qui sont autorisés à être utilisés dans le message sont les variables qui sont fournies comme arguments à la fonction englobante. Quand il n'y a pas d'arguments, nous pouvons permettre à la fonction englobante d'être omise. Cela signifierait rendre l'analyseur suffisamment intelligent pour reconnaître ce modèle.

En aparté: Je n'aime pas le motif d'appeler une fois la méthode et l'affectation à une variable finale. Il établit une condition de concurrence potentielle entre l'initialisation des paramètres régionaux et l'initialisation des variables, ce qui signifie que les paramètres régionaux ne peuvent pas changer lors de l'exécution. Cependant, je comprends quand nous avons des frameworks comme Angular qui l'appellent et qui comparent le résultat sur chaque frame qu'il devient cher d'appeler la fonction à chaque fois.

Une autre côté: Quand il n'y a pas de paramètres que vous pouvez omettre le nom. Il utilisera le texte comme nom. Quand il y a des paramètres, le texte est une interpolation donc il ne peut pas l'utiliser comme nom.