Résolution des erreurs d'analyse statique Dart
Contenu
Concepts fondamentaux et directives
Système de types et solidité
Appliquez le système de types solide de Dart pour éviter les états invalides à l'exécution.
- Surcharges de méthodes : Maintenez des types de retour solides (covariants) et des types de paramètres (contravariants). Ne resserrez jamais un type de paramètre dans une sous-classe sauf si explicitement marqué avec le mot-clé
covariant. - Génériques et collections : Ajoutez des annotations de type explicites aux classes génériques (par ex.,
List<T>,Map<K, V>). N'assignez jamais unList<dynamic>à une liste typée (par ex.,List<Cat>). - Conversion de type descendante : Évitez les conversions implicites de
dynamic. Utilisez des conversions explicites (par ex.,as List<Cat>) si nécessaire, mais assurez-vous que le type d'exécution sous-jacent correspond pour éviter les exceptionsTypeError. - Conversions strictes : Activez
strict-casts: truedansanalysis_options.yamlsousanalyzer: language:pour forcer les conversions explicites et capturer les erreurs de conversion implicite à la compilation.
Null Safety
Éliminez les erreurs statiques liées au null safety en gérant correctement l'initialisation des variables et la nullabilité.
- Modificateurs : Appliquez
?pour les types nullables,!pour les assertions de null, etrequiredpour les paramètres nommés qui ne peuvent pas être null. - Initialisation tardive : Utilisez le mot-clé
latepour les variables non-nullables garanties d'être initialisées avant utilisation. Appliquez-le spécifiquement aux variables de niveau supérieur ou d'instance où l'analyse de flux de contrôle de Dart ne peut pas prouver définitivement l'initialisation. - Wildcards : Utilisez la variable wildcard
_(Dart 3.7+) pour les variables locales ou paramètres sans binding pour éviter les avertissements de variables inutilisées.
Gestion des erreurs
Distinguez entre les exceptions récupérables et les erreurs irrécupérables.
- Capture : Capturez les sous-types
Exceptionpour les défaillances récupérables. - Erreurs : Ne capturez jamais explicitement
Errorou ses sous-types (par ex.,TypeError,ArgumentError). Les erreurs indiquent des bugs de programmation qui doivent être corrigés, non capturés. Appliquez cela en activant la règle de linteravoid_catching_errors. - Relance : Utilisez
rethrowà l'intérieur d'un bloccatchpour propager une exception tout en préservant sa trace de pile d'origine.
Workflows
Workflow : Résolution de l'analyse statique
Utilisez ce workflow séquentiel pour identifier, corriger et vérifier les erreurs d'analyse statique dans un projet Dart. Copiez la checklist pour suivre votre progression.
Progression des tâches :
- [ ] 1. Exécutez l'analyseur statique.
- [ ] 2. Appliquez les corrections automatisées.
- [ ] 3. Résolvez les erreurs restantes manuellement.
- [ ] 4. Vérifiez les corrections (Boucle de rétroaction).
1. Exécutez l'analyseur statique Exécutez l'analyseur Dart pour identifier toutes les erreurs statiques dans le répertoire ou fichier cible.
dart analyze . --fatal-infos
2. Appliquez les corrections automatisées
Utilisez l'outil dart fix pour résoudre automatiquement les problèmes de lint et d'analyse standard.
# Prévisualiser les changements
dart fix --dry-run
# Appliquer les changements
dart fix --apply
3. Résolvez les erreurs restantes manuellement Examinez la sortie restante de l'analyseur et appliquez une logique conditionnelle selon le type d'erreur :
- Si l'erreur est un problème de Null Safety (par ex., "Property cannot be accessed on a nullable receiver") :
- Vérifiez si la variable peut logiquement être null.
- Si oui, utilisez le chaînage optionnel (
?.) ou fournissez un secours (??). - Si non, et l'initialisation est garantie ailleurs, marquez la déclaration avec
late.
- Si l'erreur est une Inadéquation de type (par ex., "The argument type 'List<dynamic>' can't be assigned...") :
- Tracez l'initialisation de la variable.
- Ajoutez des annotations de type générique explicites à l'instanciation (par ex.,
<int>[]au lieu de[]).
- Si l'erreur est une Surcharge invalide (par ex., "The parameter type doesn't match the overridden method") :
- Élargissez le type de paramètre pour correspondre à la superclasse, OU
- Ajoutez le mot-clé
covariantau paramètre si resserrer le type est intentionnellement requis par la logique métier.
4. Vérifiez les corrections (Boucle de rétroaction) Exécutez le validateur. Examinez les erreurs. Corrigez.
dart analyze .
dart test
- Si
dart analyzesignale des erreurs : Retournez à l'étape 3. - Si
dart testéchoue avec unTypeError: Vous avez introduit une conversion explicite invalide (as T) ou accédé à une variablelatenon initialisée. Localisez la défaillance d'exécution et corrigez la hiérarchie de types ou l'ordre d'initialisation.
Exemples
Exemple : Correction des assignations de listes dynamiques
Entrée (Échoue l'analyse statique) :
void printInts(List<int> a) => print(a);
void main() {
final list = []; // Inféré comme List<dynamic>
list.add(1);
list.add(2);
printInts(list); // Error: List<dynamic> can't be assigned to List<int>
}
Sortie (Réussit l'analyse statique) :
void printInts(List<int> a) => print(a);
void main() {
final list = <int>[]; // Explicitement typé
list.add(1);
list.add(2);
printInts(list);
}
Exemple : Correction des surcharges de méthodes (Contravariance)
Entrée (Échoue l'analyse statique) :
class Animal {
void chase(Animal a) {}
}
class Cat extends Animal {
@override
void chase(Mouse a) {} // Error: Tightening parameter type
}
Sortie (Réussit l'analyse statique) :
class Animal {
void chase(Animal a) {}
}
class Cat extends Animal {
@override
void chase(covariant Mouse a) {} // Explicitement marqué covariant
}
Exemple : Correction du Null Safety avec late
Entrée (Échoue l'analyse statique) :
class Thermometer {
String temperature; // Error: Non-nullable instance field must be initialized
void read() {
temperature = '20C';
}
}
Sortie (Réussit l'analyse statique) :
class Thermometer {
late String temperature; // Reporte la vérification d'initialisation à l'exécution
void read() {
temperature = '20C';
}
}