【问题标题】:How to know if an Image is in memory in Flutter?在 Flutter 中如何知道图像是否在内存中?
【发布时间】:2019-08-11 22:07:59
【问题描述】:

我的应用中有一个以图像为背景的屏幕,该图像位于我的资产文件夹中。当我导航到这个屏幕时,背景瞬间是空白的,然后图像被加载并出现。这使我的屏幕在半秒或更短的时间内看起来很奇怪,但足以让用户注意到。

我希望能够仅在加载图像后导航到该屏幕(我可以在前一个屏幕上等待),因此我可以避免这种行为并在用户导航到那里时将整个屏幕作为一个整体。

我知道可以使图像淡入,但这不是我想要的体验。

【问题讨论】:

    标签: flutter flutter-navigation


    【解决方案1】:

    你需要使用ImageProvider.resolve方法

    假设您在资产中注册了一些图像。 然后你可以获取图片提供者为

    _imageProvider = Image.asset("your_asset").image.

    那么你可以添加这样的方法:

    import 'dart:ui';
    
    Image _image;
    bool _resolved;
    
    void _resolveImageProvider() {
        ImageStream stream = _imageProvider.resolve(createLocalImageConfiguration(context));
        stream.addListener(ImageStreamListener((info, _) {
          setState(() {
            //here you may set some flags or anything which indicates the image is in memory now.
            _resolved = true;
            _image = info.image;
          });
        }));
      }
    

    然后你可以在“上一屏”调用这个方法,等到监听器被触发,然后才导航到下一个视图。

    【讨论】:

    • 有趣!所以我猜一旦图像被加载到内存中,它就存在于缓存中?那么进一步加载相同的图像是“瞬时的”?
    • 没那么简单。资产图像由框架缓存,但我不能说具体在技术实现级别上。对于来自网络的图像,我相信有一个包 pub.dev/packages/cached_network_image 可以将它们缓存在磁盘上。
    • ImageProvider 的 API 文档中写着 ImageProvider uses the global imageCache to cache imagesapi.flutter.dev/flutter/painting/ImageProvider-class.html
    • precacheImage 会不会更简单一些?
    • 当然。正如我从prechaceImage 的代码中看到的那样,它是相同的,但是所有的小东西,比如删除监听器和错误处理:)
    猜你喜欢
    • 1970-01-01
    • 2020-07-23
    • 2020-04-04
    • 2012-09-18
    • 2023-02-11
    • 2019-12-25
    • 2012-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多