Le générateur d'exceptions Flutter continue d'être appelé

Aug 27 2020

J'utilise un flutter Image.file () pour afficher une image dans mon application. J'utilise également errorBuilder pour gérer les plantages et afficher un message à l'utilisateur.

Je rencontre un problème lorsque je fais ces étapes.

  1. Chargez une bonne image qui fonctionne
  2. Chargez une image corrompue dans le même widget Image.File ()
  3. Chargez la bonne image d'origine dans le même widget Image.File ()

Il semble que chaque changement de fichier après la transmission de la photo corrompue (étape 2) entraînera l'affichage du générateur d'erreur et non la nouvelle bonne image.

Si je ne transmets pas la photo corrompue à l'étape 2, la photo change comme il se doit. Est-ce un bug avec le flutter Image () ou devrais-je faire quelque chose après qu'il soit entré dans errorBuilder.

Voici ma configuration actuelle.

Image.file(
        file,
        fit: BoxFit.cover,
        errorBuilder: (BuildContext context, Object exception, StackTrace stackTrace) {
          print("Failed to initialise the file");
          print(stackTrace);
          //  Once an error occurs it always goes in here 
          return Text("an error occurred");
        },
      );

L'erreur réelle que je reçois sur tous les changements de fichiers lorsque / après la transmission du fichier corrompu est

Could not instantiate image codec.

METTRE À JOUR

J'ai écrit un jeu de fléchettes qui montre le problème que je rencontre.

https://dartpad.dev/98c2dacb481c088dfd2e5bee490f45ed

Si vous cliquez sur

  1. Bonne image
  2. Bonne image 2
  3. Bonne image
  4. Bonne image 2

Les images tournent correctement ... ce qui fonctionne.

si vous cliquez ensuite sur "Image corrompue" qui tentera de charger un fichier jpeg corrompu, le générateur d'erreur se déclenchera.

Si vous cliquez ensuite sur "Good Image" ou "Good Image 2", ils ne se construisent plus et l'image est bloquée en train de charger le générateur d'erreur à chaque fois ... Comment puis-je l'obtenir pour ensuite charger à nouveau l'une des bonnes images?

S'il vous plaît laissez-moi savoir si je n'ai pas été clair et j'ajouterai plus d'informations :)

Merci beaucoup

Réponses

chunhunghan Aug 31 2020 at 00:58

Vous pouvez copier coller exécuter le code complet ci-dessous
Cette erreur peut être corrigée avec add key: UniqueKey(),
je l'ai testé avec DardPad fonctionne bien
extrait de code

Image.network(
          _selectedImageURL,
          key: UniqueKey(),

démo de travail

code complet

import 'package:flutter/material.dart'; 

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String _goodImageOne =
      "https://upload.wikimedia.org/wikipedia/commons/6/69/June_odd-eyed-cat_cropped.jpg";
  String _corruptImage =
      "https://srv-file16.gofile.io/download/hwTzLI/cat_corrupt.jpg";
  String _goodImageTwo =
      "https://upload.wikimedia.org/wikipedia/commons/c/c7/Tabby_cat_with_blue_eyes-3336579.jpg";

  String _selectedImageURL;

  @override
  void initState() {
    super.initState();
    _selectedImageURL = _goodImageOne;
  }

  void _changeFile(String newUrl) {
    setState(() {
      _selectedImageURL = newUrl;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Image.network(
              _selectedImageURL,
              key: UniqueKey(),
              height: 300,
              width: 200,
              loadingBuilder: (BuildContext context, Widget child,
                  ImageChunkEvent loadingProgress) {
                if (loadingProgress == null) return child;
                return Center(
                    child: CircularProgressIndicator(
                  value: loadingProgress.expectedTotalBytes != null
                      ? loadingProgress.cumulativeBytesLoaded /
                          loadingProgress.expectedTotalBytes
                      : null,
                ));
              },
              errorBuilder: (BuildContext context, Object exception,
                  StackTrace stackTrace) {
                return Text("Cannot display url");
              },
            ),
            Expanded(child: Container()),
            RaisedButton(
              onPressed: () => _changeFile(_goodImageOne),
              child: Text("Good Image"),
            ),
            RaisedButton(
              onPressed: () => _changeFile(_corruptImage),
              child: Text("Corrupt Image"),
            ),
            RaisedButton(
              onPressed: () => _changeFile(_goodImageTwo),
              child: Text("Good Image 2"),
            ),
          ],
        ),
      ),
    );
  }
}