Flutter exception Builder terus dipanggil

Aug 27 2020

Saya menggunakan Image.file () flutter untuk menampilkan Image di aplikasi saya. Saya juga menggunakan errorBuilder untuk menangani error apa pun dan menampilkan pesan kepada pengguna.

Saya mengalami masalah saat melakukan langkah-langkah ini.

  1. Muat gambar bagus yang berfungsi
  2. Muat gambar yang rusak ke widget Image.File () yang sama
  3. Muat kembali gambar asli yang bagus ke widget Image.File () yang sama

Tampaknya setiap perubahan file setelah foto yang rusak diteruskan (langkah 2) akan menghasilkan pembuat kesalahan yang ditampilkan dan bukan gambar baru yang bagus.

Jika saya tidak meneruskan foto yang rusak di langkah 2, foto berubah seperti seharusnya. Apakah ini bug dengan flutter Image () atau haruskah saya melakukan sesuatu setelah masuk ke errorBuilder.

Ini adalah pengaturan saya saat ini.

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");
        },
      );

Kesalahan sebenarnya yang saya terima pada semua perubahan file ketika / setelah file yang rusak dikirim adalah

Could not instantiate image codec.

MEMPERBARUI

Saya telah menulis papan panah yang menunjukkan masalah yang saya alami.

https://dartpad.dev/98c2dacb481c088dfd2e5bee490f45ed

Jika Anda mengklik

  1. Citra Bagus
  2. Gambar Bagus 2
  3. Citra Bagus
  4. Gambar Bagus 2

Gambar berputar dengan benar ... yang berfungsi.

jika Anda kemudian mengklik "Gambar Rusak" yang akan mencoba memuat file jpeg yang rusak, pembuat kesalahan akan aktif.

Jika Anda kemudian mengklik "Gambar Bagus" atau "Gambar Bagus 2", gambar tersebut tidak lagi dibuat dan Gambar macet saat memuat pembuat kesalahan setiap saat ... Bagaimana cara membuatnya memuat salah satu gambar yang bagus lagi?

Tolong beri tahu saya jika saya belum jelas dan saya akan menambahkan lebih banyak informasi :)

Terima kasih banyak

Jawaban

chunhunghan Aug 31 2020 at 00:58

Anda dapat menyalin dan menempel menjalankan kode lengkap di bawah
ini Kesalahan ini dapat diperbaiki dengan menambahkan key: UniqueKey(),
saya telah mengujinya dengan
potongan kode DardPad berfungsi dengan baik

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

demo kerja

kode lengkap

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"),
            ),
          ],
        ),
      ),
    );
  }
}