flutter - 如何从网络图像中获取 ui.Image(dart:ui)?

Upa*_*Jah 6 android-canvas flutter flutter-layout flutter-animation

我正在尝试使用图片记录器将图像写入画布...

drawImage 需要 dart:ui 图像

我已成功导入资产图像,但网络图像出现以下错误:

[VERBOSE-2:codec.cc(97)] 解码图像失败。数据无效,或使用不受支持的格式编码。

[VERBOSE-2:shell.cc(186)] Dart 错误:未处理的异常:异常:操作失败 0 _rootHandleUncaughtError。(dart:async/zone.dart:1112:29) 1 _microtaskLoop (dart:async/schedule_microtask.dart:41:21) 2 _startMicrotaskLoop (dart:async/schedule_microtask.dart:50:5)

到目前为止尝试过的代码..

netImage.obtainKey(new ImageConfiguration()).then((val) {
  var load = netImage.load(val);

  load.addListener((listener, err) async {
    ImageInfo imageInfo;
    setState(() => imageInfo = listener);

    imageInfo.image.toByteData().then((ss) {

      Uint8List lst = new Uint8List.view(ss.buffer);

      ui.instantiateImageCodec(lst).then((val) {
        val.getNextFrame().then((vaal) {
          imagetoDraw = vaal.image;
        });
      });
    });
  });
});
Run Code Online (Sandbox Code Playgroud)

Mr *_*ial 10

我遇到了同样的问题。我通过如下代码片段解决了它:

...
  Future<ui.Image> getImage(String path) async {
    Completer<ImageInfo> completer = Completer();
    var img = new NetworkImage(path);
    img.resolve(ImageConfiguration()).addListener(ImageStreamListener((ImageInfo info,bool _){
      completer.complete(info);
    }));
    ImageInfo imageInfo = await completer.future;
    return imageInfo.image;
  }
....
Run Code Online (Sandbox Code Playgroud)


Upa*_*Jah 0

来自https://github.com/flutter/flutter/issues/23761

    netImage.obtainKey(new ImageConfiguration()).then((val) {
      var load = netImage.load(val);

      load.addListener((listener, err) async {

        setState(() => imageInfo = listener);

//        imageInfo.image.toByteData().then((ss) {
//
//          Uint8List lst = new Uint8List.view(ss.buffer);
//
////          ui.instantiateImageCodec(lst).then((val) {
////            val.getNextFrame().then((vaal) {
////              imagetoDraw = vaal.image;
////            });
////          });
//        });
      });
    });
Run Code Online (Sandbox Code Playgroud)

进而..

c.drawImage(imageInfo.image, offset3, paint);
Run Code Online (Sandbox Code Playgroud)