我正在使用Flutter Image.file()在我的应用程序中显示图像。我还使用errorBuilder来处理任何崩溃并向用户显示一条消息。
执行这些步骤时遇到问题。
在传入损坏的照片(步骤2)之后,似乎每个文件更改都会导致显示错误生成器,而不是新的良好图像。
如果我没有在步骤2中传递损坏的照片,则照片会像应该的那样变化。这是Flutter Image()的错误,还是在进入errorBuilder之后我应该做些什么呢?
这是我当前的设置。
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");
},
);
在传入损坏文件时/之后,我在所有文件上收到的实际错误是
Could not instantiate image codec.
更新
我写了一个飞镖,可以显示我遇到的问题。
https://dartpad.dev/98c2dacb481c088dfd2e5bee490f45ed
如果您单击
图像正确循环...有效。
如果您随后单击“损坏的映像”,这将尝试加载损坏的jpeg文件,则会触发错误生成器。
如果您随后单击“良好映像”或“良好映像2”,它们将不再构建,并且映像每次都无法加载错误生成器...我如何获取它然后再次加载其中一个良好映像?< / p>
如果不清楚,请告诉我,我将添加更多信息:)
非常感谢
答案 0 :(得分:0)
您可以在下面复制粘贴运行完整代码
可以使用添加key: UniqueKey()
来解决此错误,
我已经用DardPad进行了测试,效果很好
代码段
Image.network(
_selectedImageURL,
key: UniqueKey(),
工作演示
完整代码
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"),
),
],
),
),
);
}
}