Flutter exception Builder terus dipanggil
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.
- Muat gambar bagus yang berfungsi
- Muat gambar yang rusak ke widget Image.File () yang sama
- 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
- Citra Bagus
- Gambar Bagus 2
- Citra Bagus
- 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
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"),
),
],
),
),
);
}
}