当前位置: 首页 > 知识库问答 >
问题:

在生成之前预加载资产映像

桓喜
2023-03-14

我正在尝试将容器的背景图像设置为来自资产的图像,如下所示:

return new Container(
            decoration: new BoxDecoration(
              image: new DecorationImage(
                image: new AssetImage(images[index]),
                fit: BoxFit.cover,
              ),
            ),

但这将需要一些时间来加载和返回空白,同时屏幕直到图像加载。.

因此,我尝试在构建之前预加载图像,如下所示:

@override
void initState() {
precacheImage(new AssetImage(images[1]), context);
precacheImage(new AssetImage(images[2]), context);
precacheImage(new AssetImage(images[3]), context);
super.initState();
}

这返回了这个错误:

共有2个答案

应煌
2023-03-14

我不确定,但我想,你可以试试FutureBuilder

import 'dart:ui' as ui;

class MyImage extends StatelessWidget {
  MyImage(this._imgSrc);
  final String _imgSrc;

  @override
  Widget build(BuildContext context) {
    Image image = Image.asset(_imgSrc);
    Completer<ui.Image> completer = new Completer<ui.Image>();
    image.image.resolve(ImageConfiguration()).addListener((ImageInfo info, bool _) {
      completer.complete(info.image);
    });
    return FutureBuilder(
        future: completer.future,
        builder: (context, AsyncSnapshot<ui.Image> snapshot) {
          return snapshot.hasData ? image : Container();
        });
  }
慕冠宇
2023-03-14

我有同样的问题,解决方案是在错误描述本身:

基于继承的小部件的初始化可以放在didChangeDependencies方法中,该方法在initState之后以及依赖项发生更改时调用。

下面是我的代码的简化版本,在方法didChangeDependencies中预加载图像:

class _SampleWidgetState extends State<SamleWidget> {
  Image image1;
  Image image2;
  Image image3;
  Image image4;

  Image currentImage;

  @override
  void initState() {
    super.initState();

    image1 = Image.asset("assets/image1.png");
    image2 = Image.asset("assets/image2.png");
    image3 = Image.asset("assets/image3.png");
    image4 = Image.asset("assets/image4.png");

    currentImage = image1;
  }

  @override
  void didChangeDependencies() {
    super.didChangeDependencies();

    precacheImage(image1.image, context);
    precacheImage(image2.image, context);
    precacheImage(image3.image, context);
    precacheImage(image4.image, context);
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      child: currentImage,
    );
  }

  void setImage(int index) {
      switch (index) {
        case 1: currentImage = image1; break;
        case 2: currentImage = image2; break;
        case 3: currentImage = image3; break;
        case 4: currentImage = image4; break;
      }
  }
}

希望这有助于:)

 类似资料:
  • 在JavaFX中,我使用stage1从一个阶段切换到另一个阶段。隐藏();第二阶段。show(); 然而,第二阶段相当大,包含了一大堆元素。所以当我显示()它时,当它第一次弹出时,有一段400毫秒的时间,整个阶段是空的和灰色的。然后所有的元素都出现了。 太难看了。这是在i7上,有一个非常好的图形处理器。 我已经注意到,如果我展示它,然后隐藏它,然后再次展示它,最终的节目从它出现在屏幕上的那一刻起就

  • 以下是错误按摩: 无法加载Asset:Assets/Images/Waiting.png当引发异常时,这是堆栈图像提供程序:AssetImage(bundle:null,name:“Assets/Images/Waiting.png”)图像键:AssetBundleImageKey(bundle:PlatformAssetBundle#e3e67(),name:“Assets/Images/Wai

  • 我知道我将文本文件放在了assets\chat1的位置。txt,我的代码也可以与其他txt一起使用,但不知何故,我总是遇到以下错误: 发生异常。 错误(无法加载资产:assets/chat1.txt) 我的代码: pubspec.yaml

  • 我试图从URL中获取数据,但我需要的信息需要几秒钟才能加载,并且在加载之前只在HTML中显示为加载,所以当我使用此代码时,我无法提取我需要的数据。 我怎么能让网址加载一段时间,然后再把超文本标记语言去掉呢?

  • 即使其他资产(js,css)正在被成功加载和服务,允许的img文件夹中的图像没有被服务,一个破碎的图像显示在指定的页面上。 这是映像所在的位置: src/main/resources/statig/img/image.png 请指导我如何进行? PS:我使用的是Java DSL,而不是基于xml的配置。 我做了搜索,并看到了几个解决方案不适合我的情况。(在此之前对以下内容进行了检查:

  • 我正在尝试将wordpress安装在一个位于正面HTTPS负载平衡器后面的服务器上。 问题是我尝试安装它的服务器不使用HTTPS,因为它在安全网络中并且只与负载均衡器对话。 我猜wordpress检测到服务器协议,所以现在当我尝试安装它时,希望通过HTTP加载所有资产。 浏览器为此向我大喊“混合内容”警告。如果不加载cs/js文件,即使尝试运行整个安装过程也很困难。 我只想告诉wordpress尝