在 Flutter 中预加载本地图片资源

Preloading local image assets in Flutter

我有一张图像资产列表,屏幕上有一个图像小部件。我使用一个按钮循环通过它们,使用 setState()。


    const List<String> _photoData = const [
      "assets/generic-cover.jpg",
      "assets/generic-cover2.jpg",
      "assets/generic-cover3.jpg",
      "assets/generic-cover4.jpg",
    ];

    class _MyHomePageState extends State<MyHomePage> {

      int _coverPhoto = 0;

      void _switchCoverPhoto() {
        setState(() {
          _coverPhoto++;
          if (_coverPhoto == _photoData.length) {
             _coverPhoto = 0;
          }
        });
      }

      @override
      Widget build(BuildContext context) {

        return new Scaffold(
          body: new Stack(
            children: <Widget>[
              new Image.asset (
                _photoData[_coverPhoto],
                fit: ImageFit.cover,
                height: 600.0,
              ),
              new Positioned ( // photo toggle button
                child: new IconButton(
                  icon: new Icon (Icons.photo),
                  onPressed: _switchCoverPhoto,
                  color: Colors.white,
                ),
                top: 32.0,
                right: 32.0,
              ),
            ]
          )
        );
      }

第一张图片渲染良好。但是,当我调用 _switchCoverPhoto() 时,在显示“assets/generic-cover2.jpg”之前会出现短暂的白色闪烁。

这引出了一个简单的问题:有没有一种简单的方法可以将后续图像(或图像)预加载到内存中,以便事先没有闪存?

See attached GIF for a loose approximation.

确保您的图片 gaplessPlayback 设置为 true

这不会解决预加载问题,但会防止切换资产时图像闪烁为白色。

将 gaplessPlayback 设置为 true 后,您的原始图像将一直保留,直到新图像完成加载并且 "white flash gap" 不会出现。

var img = new Image.asset(
  _photoData[_coverPhoto],
  fit: ImageFit.cover,
  height: 600.0,
  gaplessPlayback: true,
);