颤动图像预加载

Mug*_*tsu 18 dart flutter

是否有可能以某种方式预加载应用程序启动时的图像?就像我在我的抽屉里,但对于第一次当我打开抽屉有一个背景图片可以看我的图像闪烁喜欢它是从资产获取并显示,它给不好的经历对我来说,一旦我看到它用于其他第一次抽屉的开口表现得如预期的那样,因为它是缓存的.我想在app load上预取它,所以没有这样的效果.

Jon*_*ams 24

precacheImage在构建抽屉之前,使用该功能开始加载图像.例如,在包含抽屉的小部件中:

class MyWidgetState extends State<MyWidget> {

  @override
  void initState() {
    // adjust the provider based on the image type
    precacheImage(new AssetImage('...'));
    super.initState();
  }

}
Run Code Online (Sandbox Code Playgroud)

  • `precacheImage` 应该在 `didChangeDependency()` 中调用,因为它需要一个允许媒体查询的 `BuildContext`。在 `initState()` 中调用它可能会导致未处理的异常等。请参阅@Ethirallan的答案 (4认同)
  • 在我的情况下,precacheImage方法需要上下文:precacheImage(new AssetImage('...'),context); (2认同)

Ric*_*eau 9

关于这个主题有一篇很好的文章:https : //alex.domenici.net/archive/preload-images-in-a-stateful-widget-on-flutter

它应该看起来像这样

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

  @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");
  }

  @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: Stack(
            children: <Widget>[
              image1,
              image2,
              image3,
              image4,
            ],
          ),
        );
  }
}
Run Code Online (Sandbox Code Playgroud)

  • @iDecode我认为我的答案更具可读性 (4认同)

cre*_*not 8

要摆脱“闪烁”,您可以简单地将FadeInImage与 结合使用transparent_image,它会消失而不是立即出现。在您的情况下,用法如下所示:

// you need to add transparent_image to your pubspec and import it
// as it is required to have the actual image fade in from nothing
import 'package:transparent_image/transparent_image.dart';
import 'package:flutter/material.dart';

...
  FadeInImage(
    placeholder: MemoryImage(kTransparentImage),
    image: AssetImage('image.png'),
  )
Run Code Online (Sandbox Code Playgroud)

  • 这实际上并没有回答被问到的问题 (7认同)
  • @JonahWilliams 我这么认为是因为大部分问题都包含“闪烁”效果作为一个整体,即使标题没有暗示:“所以没有这种效果”是我试图回答的。 (6认同)

小智 7

我在initState中使用precacheImage()的上部解决方案遇到了问题。下面的代码解决了它们。另请注意,您可能在调试模式下看不到预期的结果,而仅在发布模式下见到。

Image myImage;

  @override
  void initState() {
    super.initState();
    myImage= Image.asset(path);
  }

  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
    precacheImage(myImage.image, context);
  }
Run Code Online (Sandbox Code Playgroud)

  • 如果小部件是有状态的,那确实很有帮助。如果是无状态的,则可以在创建小部件之前进行预缓存 (2认同)

Tan*_*vir 5

precacheImage()函数(在大多数答案中使用)返回 a Future,对于某些用例场景,它可能非常有用。例如,在我的应用程序中,我需要加载外部图像,并且像其他人一样不想体验闪烁。所以我最终得到了这样的结果:

// show some sort of loading indicator
...

precacheImage(
    NetworkImage(),
    context,
).then((_) {
    // replace the loading indicator and show the image
    // (may be with some soothing fade in effect etc.)
    ...
});
Run Code Online (Sandbox Code Playgroud)

请注意,在上面的示例中,我想说明如何Future潜在地使用 。评论只是为了帮助表达想法。实际实施必须以某种Fluttery方式完成。