Bien entendu, null-safety est une Ă©tape importante dans le dĂ©veloppement du langage. L'Ă©quipe Dart a annoncĂ© une version bĂȘta de la version null-safety! Nous avons traduit en russe l'actualitĂ© de cette version, dans laquelle vous apprendrez comment migrer vers de nouvelles versions, quels avantages vous en tirerez et quels sont les avantages de la sĂ©curitĂ© nulle pour nous tous.
Aujourd'hui, nous annonçons qu'une version bĂȘta fiable de sĂ©curitĂ© nulle est disponible pour Dart et Flutter. Null-safety est notre derniĂšre avancĂ©e majeure pour vous aider Ă Ă©viter les bogues de rĂ©fĂ©rencement nul, une classe de bogues souvent difficiles Ă dĂ©tecter. Cette vidĂ©o explique en termes gĂ©nĂ©raux la raison de notre joie:
Avec le passage Ă la version bĂȘta avec null-safety, il est temps de migrer les milliers de packages disponibles sur pub.dev . Nous avons portĂ© les bibliothĂšques principales de Dart, le framework Flutter et plus de 40 packages Dart et Flutter. Cela Ă©tant dit, nous espĂ©rons que la communautĂ© acceptera null-safety lors de la migration de ses paquets.
Avec la version bĂȘta, nous entrons Ă©galement dans la derniĂšre ligne droite avant la sortie de la version stable Ă sĂ©curitĂ© nulle. Nous espĂ©rons que vous profiterez de cette fonctionnalitĂ© et que vous nous indiquerez si elle peut ĂȘtre amĂ©liorĂ©e et rendre les messages et la documentation de l'interface utilisateur plus clairs. Nous attendons vos commentaires avec impatience .
Choisir null-safety
Avant de discuter de la migration vers null-safety, nous souhaitons réitérer que (comme indiqué dans nos directives de null-safety ) vous avez la possibilité de choisir exactement quand démarrer la migration. Les applications et les packages ne fonctionneront avec la sécurité nulle que si leur limite minimale du SDK Dart est au moins la version préliminaire de Dart 2.12:
environment:
sdk: ">=2.12.0-0 <3.0.0"
Pour l'essayer, essayez de créer une petite application Hello de sécurité nulle (par exemple avec
dart create
) contenant le code comme indiqué ci-dessous. Ensuite, vous pouvez essayer d'exécuter l'application avant et aprÚs la modification de la limite du SDK et la lancer dart pub get
et voir comment le comportement du programme change. (Assurez-vous de vous dart --version
renvoyer exactement 2.12).
bin/hello.dart:
...
void main() {
var hello = 'Hello Dart developers';
if (someCondition) {
hello = null;
}
print(hello);
}
Before changing the SDK constraint:
$ dart run
null
After changing the SDK constraint (and running dart pub get):
$ dart run
bin/hello.dart:6:13: Error: Null can't be assigned to a variable of
type 'String' because 'String' is not nullable.
hello = null;
^
Passer à la sécurité nulle
Pour migrer un package (ou une application simple) vers le mode de sécurité nul, suivez ces cinq étapes, qui sont détaillées dans le guide de migration de dart.dev.
Ătape 1: vĂ©rifiez si vos dĂ©pendances sont prĂȘtes
Nous vous recommandons fortement de déplacer le code dans l'ordre, en commençant par les «feuilles» du graphe de dépendances. Par exemple, si C dépend de B, qui dépend de A, migrez d'abord vers la sécurité nulle A, puis B, puis C. Cet ordre s'applique que A, B et C soient des bibliothÚques, des packages ou des applications.
Pourquoi l'ordre est-il si important? Vous pouvez progresser dans la migration de votre code avant de migrer vos dépendances, mais vous courez le risque d'avoir à réexécuter si vos dépendances modifient leurs interfaces pendant la migration. Si certaines de vos dépendances ne sont pas null-safety, envisagez de contacter les éditeurs de packages en utilisant les coordonnées répertoriées pour chaque package sur pub.dev.
VĂ©rifier si les dĂ©pendances sont prĂȘtes
Pour vĂ©rifier si votre application ou package est prĂȘt Ă dĂ©marrer la migration, vous pouvez exĂ©cuter
dart pub outdated
en mode de sĂ©curitĂ© nul. L'exemple ci - dessous montre que l'application est prĂȘte pour la migration si elle met Ă jour ses dĂ©pendances path
, process
et pedantic
à , les versions préliminaires figurant dans la résoluble colonne .
Si la prise en charge de la sécurité nulle est disponible dans les versions mineures plus récentes, vous les verrez dans la colonne Mise à jour . La prise en charge de la sécurité nulle sera souvent disponible dans les nouvelles versions majeures; dans ce cas, vous verrez les versions répertoriées dans la section Résoluble dans la sortie de l'utilitaire obsolÚte. Pour basculer vers eux, modifiez le fichier
pubspec.yaml
pour autoriser ces versions principales. Par exemple, vous pouvez changer
process: ^3.0.13
en process: ^4.0.0-nullsafety
.
Vous pouvez également trouver des packages avec prise en charge de la sécurité nulle sur pub.dev en utilisant les nouvelles balises de sécurité Null sur les pages des packages (par exemple, collection 1.15 ) et la nouvelle option de recherche avancée de sécurité nulle.
Ătape 2: transfert Ă l'aide de l'outil de migration
Une fois les dĂ©pendances prĂȘtes, vous pouvez commencer Ă migrer votre application ou package Ă l'aide de l'outil de migration
dart migrate
.
L'outil de migration est interactif, vous pouvez donc afficher les propriĂ©tĂ©s de sĂ©curitĂ© nulles dĂ©duites par cet outil. Si vous n'ĂȘtes pas d'accord avec un rĂ©sultat de l'outil, vous pouvez ajouter des indices nuls pour le modifier. L'ajout de quelques conseils peut avoir un impact considĂ©rable sur la qualitĂ© de votre migration.
Plusieurs auteurs de packages Dart ont testé les migrations à l'aide des premiÚres versions de pré-build null-safety, et leurs commentaires ont été encourageants. Le guide de migration contient des conseils supplémentaires sur l'utilisation de l'outil de migration.
Ătape 3: analyse statique du code portĂ©
Mettez Ă jour les packages Ă l'aide de pub get dans votre IDE ou en ligne de commande. Ensuite, utilisez un IDE ou une ligne de commande pour effectuer une analyse statique sur votre code Dart:
$ dart pub get
$ dart analyze
Ou en code Flutter:
$ flutter pub get
$ flutter analyze
Ătape 4: assurez-vous que les tests rĂ©ussissent
ExĂ©cutez les tests et assurez-vous qu'ils rĂ©ussissent en toute sĂ©curitĂ©. Vous devrez peut-ĂȘtre mettre Ă jour les tests attendus null si vous modifiez le code de votre package pour ne pas autoriser les valeurs nulles.
Ătape 5: publier votre package null-safety
AprÚs avoir terminé la migration et exécuté les tests, vous pouvez publier votre package en tant qu'avant-premiÚre. Voici un résumé des meilleures pratiques:
- Mettez Ă niveau la version vers la prochaine version majeure (par exemple, de
2.3.x
Ă3.0.0
). Cela garantit que les utilisateurs de votre package ne mettent pas Ă niveau vers celui-ci tant qu'ils ne sont pas prĂȘts Ă utiliser null-safety. Cela vous donne la libertĂ© de refactoriser votre API pour tirer le meilleur parti de la sĂ©curitĂ© nulle. - Traduisez et publiez votre package en aperçu sur pub.dev . (Par exemple, utilisez
3.0.0-nullsafety.0
et non3.0.0
.)
Pour plus d'informations sur la migration et la gestion des versions, consultez le guide de migration .
Avantages de la sécurité nulle garantie
Nos articles précédents sur les aperçus techniques de sécurité nulle dans Dart et Flutter ont discuté des avantages de ces changements à l'aide d'un certain nombre d'exemples. Maintenant que la sécurité nulle est en voie d'achÚvement, nous voyons plusieurs exemples concrets de cet avantage.
Code plus sécurisé
Nous avons récemment découvert un bug sur la branche principale de Flutter qui a provoqué diverses commandes d'outils pour
flutter
Ă©craser sur certaines configurations de la machine avec une valeur nulle: erreur The method '>=' was called on null
. Le problÚme principal était une demande d'extraction récente pour ajouter la prise en charge de la détection Android Studio 4.1. Cette demande d'extraction a ajouté un code comme celui-ci:
final int major = version?.major;
final int minor = version?.minor;
if (globals.platform.isMacOS) {
/// plugin path of Android Studio changed after version 4.1.
if (major >= 4 && minor >= 1) {
...
Pouvez-vous trouver un bug? Ătant donnĂ© que la version peut ĂȘtre nulle, les versions majeures et mineures peuvent Ă©galement ĂȘtre nulles. Ce bogue peut sembler facile Ă trouver ici isolĂ©ment, mais en pratique, ce type de code se glisse tout le temps, mĂȘme avec le processus rigoureux de rĂ©vision de code utilisĂ© dans le rĂ©fĂ©rentiel Flutter. Avec la sĂ©curitĂ© nulle, l'analyse statique rattrape ce problĂšme immĂ©diatement :
c'était une erreur assez simple. Au début de l'utilisation de la sécurité nulle dans le code interne de Google, nous avons vu à quel point des erreurs plus complexes étaient détectées puis résolues par la sécurité nulle. Voici quelques exemples:
- , null , null-safety null. , protobuf, , , null. , , - null .
- Google Pay Flutter, - Flutter
State
Widget
. null-safety null ; null-safety , null, . - Flutter , - Flutter , null
scene
Window.render()
. null-safety , Scene , , null.
null-safety
La sécurité nulle de Dart est également importante: les compilateurs Dart peuvent utiliser des informations de sécurité nul. Cela peut rendre vos programmes plus petits et plus rapides. Jusqu'à présent, nous n'avons pas beaucoup d'applications réelles entiÚrement traduites en null-safety (aprÚs tout, nous commençons tout juste à migrer l'écosystÚme de packages dont ces applications dépendent pour la fiabilité), mais nous voyons des résultats trÚs encourageants du cadre principal.
Nous avons récemment exécuté une recompilation de test de l'exemple hello_world pour mesurer l'impact de la sécurité nulle sur la taille de l'application. Ceci est un exemple minimal qui affiche simplement "bonjour le monde". Lors de la comparaisonde la taille totale du code compilé, la taille du code non compressé (installé sur l'appareil) a été réduite de 3,5% sans aucune action autre que la recompilation avec une sécurité nulle fiable. Cela était possible malgré le fait que toute l'application se composait de 10 lignes de code, car la taille du code de toutes les bibliothÚques incluses était réduite; par exemple, le framework Flutter (
package:flutter
) lui-mĂȘme a diminuĂ© de 3,9%.
En termes de vitesse du code, la nécessité d'appliquer un systÚme de type de données de confiance augmente potentiellement la surcharge. Cependant, moins de vérifications nulles peuvent également accélérer votre code. L'analyse initiale des benchmarks montre que les performances sont comparables à celles des versions précédentes et que de nouvelles informations de type supplémentaires nous donnent le potentiel de nouvelles façons d'améliorer les performances à l'avenir. Nous prévoyons d'écrire plus à ce sujet dans de futures publications.
Dans certains cas, nous avons déjà vu comment la sécurité nulle a conduit à des gains de performances lorsque la transition a trouvé une faille dans la logique du code. Par exemple, nous avons trouvé un problÚme dans le cache de positionnement de texte du Web Flutter. Ce cache utilisait une clé nullable puis, selon la logique donnée, utilisé
TextAlign.start
quand nul. Cette logique provoquait une erreur de cache oĂč les Ă©lĂ©ments semblaient avoir changĂ©, mĂȘme s'ils avaient toujours une valeur par dĂ©faut. En consĂ©quence, il y avait souvent des appels improductifs vers le cache. L'ajout de getter textAlign
qui n'autorise pas la valeur null, permet de corriger la mise en cache des erreurs, ce qui entraĂźne une augmentation des performances de rendu du texte 14 fois dans les cas de texte mis en cache.
Commencer aujourd'hui!
Les versions bĂȘta de Dart et Flutter contenant null-safety sont prĂȘtes. Si vous Ă©crivez en Flutter, vous pouvez passer en version bĂȘta avec
flutter channel beta
et ensuite flutter upgrade
. Et si vous n'utilisez pas Flutter, vous pouvez obtenir le SDK Dart autonome Ă partir de l' archive Dart SDK .
Si vous développez des packages, nous vous recommandons de lire notre guide de migration et de planifier votre migration. Veuillez nous faire part de vos problÚmes ou suggestions.
Si vous ĂȘtes un dĂ©veloppeur d'applications, vous pouvez reporter le portage jusqu'Ă ce que la fonctionnalitĂ© arrive dans nos versions stables. Nous prĂ©voyons de rĂ©pondre rapidement aux commentaires de la version bĂȘta et de rĂ©soudre les problĂšmes restants. Il est difficile de nommer un calendrier prĂ©cis pour le moment oĂč null-safety sera publiĂ© dans une version stable, mais nous pensons au dĂ©but de l'annĂ©e prochaine.
Merci pour votre soutien et vos commentaires! Nous travaillons Ă faire de Dart un langage plus robuste et Flutter un framework plus puissant.
Michael Thomsen, chef de produit pour Dart et Flutter, a publié cet article sur le blog officiel de Dartlang. Si vous souhaitez écouter le discours de Michael et interagir avec lui en personne, venez à DartUP 2020 Online les 4 et 5 décembre et discutez des derniÚres mises à jour linguistiques avec l'équipe de Dart et la communauté.