不需要BuildContext预加载图片

4
有没有一种方法可以在Flutter中的函数中加载图片,而不需要访问BuildContext?
Flutter可以使用
precacheImage()
预加载图像,但需要一个BuildContext并且使用起来不方便。
我想在StatefulWidget的initState()方法中加载图像,但precacheImage()不支持此操作。
有一个关于预加载图像的未解决问题,该问题表明目前不支持在没有BuildContext的情况下加载图像。 https://github.com/flutter/flutter/issues/26127

1
如果你想在initState中缓存图片,那么你可以使用BuildContext——它是State.context属性,因此可以创建一个方法,如下所示:precache() async { await precacheImage(AssetImage('images/bg.jpg'), context); print('precacheImage done'); },并在initState中调用它,通过调用Future(precache); - pskink
1个回答

1

我知道两个解决方法,第一个是像这样初始化状态为“delayed”:

import 'package:flutter/material.dart';

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  var image;

  @override
  void initState() {
    super.initState();
    Future.delayed(Duration.zero).then((_) {
      //Your code here
    });
  }

  @override
  Widget build(BuildContext context) {
    return Container();
  }
}

第二种方法是使用didChangeDependencies,如下所示:
import 'package:flutter/material.dart';

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  var image;

  bool init = true;  

  @override
  void didChangeDependencies() {
    if (init) {
      init = false;
      //your code here
    }
    super.didChangeDependencies();
  }

  @override
  Widget build(BuildContext context) {
    return Container();
  }
}

init布尔值是为了防止didChangeDependecies多次运行相同的代码,因为它会经常重新运行。

希望这可以帮助你。


2
谢谢您的回答!预加载图像是我多年来一直遇到的问题。预加载/预缓存绝对是一个尚未解决的问题。我将保持这个问题的开放,以看看是否还有其他人有更多的想法。 - Ray Li

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接