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

bko*_*ash 11 dart 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,
          ),
        ]
      )
    );
  }
Run Code Online (Sandbox Code Playgroud)

第一张图片渲染得很好.但是,当我调用_switchCoverPhoto()时,在显示"assets/generic-cover2.jpg"之前会有一个简短的白色闪烁.

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

请参阅随附的GIF以获得宽松的近似值.

Dvd*_*ibi 15

确保已gaplessPlayback设置true为您的图像.

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

如果将gaplessPlayback设置为true,则原始图像将保留,直到新图像完成加载并且不会出现"白色闪烁间隙".

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