如何判断NetworkImage何时完成加载?

Set*_*add 4 dart flutter

我有一个NetworkImage,我想知道它何时完成加载.我怎么做?

Col*_*son 12

你可以resolve得到一个ImageStreamaddListenerImageStream

import 'package:flutter/material.dart';

void main() {
  runApp(new MyApp());
}

class MyApp extends StatefulWidget {
  State createState() => new MyAppState();
}

class MyAppState extends State<MyApp> {
  Image _image = new Image.network(
    'https://flutter.io/images/flutter-mark-square-100.png',
  );
  bool _loading = true;

  @override
  void initState() {
    _image.image.resolve(new ImageConfiguration()).addListener((_, __) {
      if (mounted) {
        setState(() {
          _loading = false;
        });
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      home: new Scaffold(
        body: new Center(
          child: _loading ? new Text('Loading...') : _image,
        ),
      ),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 我需要以某种方式关闭这个 imageStream 吗? (2认同)
  • 侦听器现在必须编写为: _image.image.resolve(ImageConfiguration()).addListener(ImageStreamListener((ImageInfo info, boolsyncCall) =&gt; Completer.complete())); (2认同)

小智 12

您可以使用 ImageStreamListener 来实现。ImageStreamListener 的第一个参数是 ImageListener 回调,当图像完全加载时调用它。

 var _image = NetworkImage("URL");

 _image.resolve(ImageConfiguration()).addListener(
    ImageStreamListener(
      (info, call) {
        print('Networkimage is fully loaded and saved');
        // do something
      },
    ),
  );
Run Code Online (Sandbox Code Playgroud)


小智 7

我在flutter官方demo\xef\xbc\x8c中找到了这个方法希望对你有帮助。

\n\n
import \'dart:async\';\nimport \'package:flutter/material.dart\';\n\nvoid _imageLoad() async {\n\n    String imageName = "";\n\n    Image downloadImage = new Image.network(imageName);\n\n    final ImageStream stream = downloadImage.image.resolve(ImageConfiguration.empty);\n    final Completer<void> completer = Completer<void>();\n    stream.addListener((ImageInfo info, bool syncCall) => completer.complete());\n    await completer.future;\n    if (mounted) {\n      //do sth\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n