dart-fix-runtime-errors

Par flutter · skills

Utilise `get_runtime_errors` et `lsp` pour récupérer une stack trace active, localiser la ligne défaillante, appliquer un correctif et vérifier la résolution via `hot_reload`.

npx skills add https://github.com/flutter/skills --skill dart-fix-runtime-errors

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 un List<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 exceptions TypeError.
  • Conversions strictes : Activez strict-casts: true dans analysis_options.yaml sous analyzer: 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, et required pour les paramètres nommés qui ne peuvent pas être null.
  • Initialisation tardive : Utilisez le mot-clé late pour 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 Exception pour les défaillances récupérables.
  • Erreurs : Ne capturez jamais explicitement Error ou 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 linter avoid_catching_errors.
  • Relance : Utilisez rethrow à l'intérieur d'un bloc catch pour 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é covariant au 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 analyze signale des erreurs : Retournez à l'étape 3.
  • Si dart test échoue avec un TypeError : Vous avez introduit une conversion explicite invalide (as T) ou accédé à une variable late non 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';
  }
}

Skills similaires