Flutter异常生成器不断被调用

时间:2020-08-27 19:38:47

标签: flutter dart

我正在使用Flutter Image.file()在我的应用程序中显示图像。我还使用errorBuilder来处理任何崩溃并向用户显示一条消息。

执行这些步骤时遇到问题。

  1. 加载有效的图像
  2. 将损坏的图像加载到同一Image.File()小部件中
  3. 将原始的好图像重新加载到同一Image.File()小部件中

在传入损坏的照片(步骤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

如果您单击

  1. 良好的形象
  2. 好形象2
  3. 良好的形象
  4. 好形象2

图像正确循环...有效。

如果您随后单击“损坏的映像”,这将尝试加载损坏的jpeg文件,则会触发错误生成器。

如果您随后单击“良好映像”或“良好映像2”,它们将不再构建,并且映像每次都无法加载错误生成器...我如何获取它然后再次加载其中一个良好映像?< / p>

如果不清楚,请告诉我,我将添加更多信息:)

非常感谢

1 个答案:

答案 0 :(得分:0)

您可以在下面复制粘贴运行完整代码
可以使用添加key: UniqueKey()来解决此错误,
我已经用DardPad进行了测试,效果很好
代码段

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

工作演示

enter image description here

完整代码

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