最新公告
  • 欢迎您光临网站无忧模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 关于 Flutter 网络图片加载与缓存使用过程总结 |8月更文挑战

    正文概述 掘金(头疼脑胀的代码搬运工)   2021-08-13   1009

    这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战

    废话开篇:文章内容主要是在使用flutter插件过程中的一些总结。

    添加插件库:

    cached_network_image: ^3.0.0
    

    安装指令:

    关于 Flutter 网络图片加载与缓存使用过程总结 |8月更文挑战

    这里就遇到了一些问题,工程在引入网络缓存图片组件前已经添加了 dio 网络依赖和 path_provider 本地存储依赖, 但是 cached_network_image 也依赖了上面的两个插件,如果dio 和 path_provider的版本跟 cached_network_image 的版本不匹配会报错,不过没关系,报错时终端会提示应加载的依赖组件的版本号,这里根据提示修改好,再执行安装插件指令即可。

    这里将 dio 版本升级到 4.0.0 后发现之前到拦截器对象报错,查看版本后发现不但是拦截器对象的 onRequest、onResponse、onError方法的声明参数变了,返回值也发生了变化,这里记录一下。

    Interceptor dInter = InterceptorsWrapper(
      onRequest: (RequestOptions options,RequestInterceptorHandler handler){
        options.queryParameters.addAll({'token':'H+0At+PcIWLY1kjg4ws9gqzwsese9322B81ARjj2eMk='});
        //以前版本这里只return options即可,现在需要返回 handler.next(options)
        return handler.next(options);
      },
      onResponse: (Response response,ResponseInterceptorHandler handler){
      //同理
        return handler.next(response);
      },
      onError: (DioError error,ErrorInterceptorHandler handler){
      //同理
        return handler.next(error);
      }
    );
    
    import 'package:cached_network_image/cached_network_image.dart';
    import 'package:flutter/cupertino.dart';
    import 'package:flutter/material.dart';
    
    class GeneralFadeInImage extends StatelessWidget {
      String image;
      BoxFit fit;
      String placeholder;
      double width;
      GeneralFadeInImage({required this.image,this.fit = BoxFit.fill,this.placeholder = 'assets/images/placeholderimg.png',this.width = 0});
      
      //加载网络图片及缓存
      Widget _cacheImage(){
        return (this.width == 0) ? CachedNetworkImage(
          imageUrl: this.image,
          fit: this.fit,
          placeholder: (context, url) => Image.asset(this.placeholder,fit: this.fit,),
          errorWidget: (context, url, error) =>
              Image.asset('images/image-failed.png'),
        ) : CachedNetworkImage(
          imageUrl: this.image,
          fit: this.fit,
          width: this.width,
          placeholder: (context, url) => Image.asset(this.placeholder,fit: this.fit,),
          errorWidget: (context, url, error) =>
              Image.asset('images/image-failed.png'),
        );
      }
    
      //加载网络图片
      Widget _loadNetworkImage(){
        return (this.width == 0) ? new FadeInImage.assetNetwork(
            placeholder: this.placeholder,
            image: this.image,
            fit: this.fit,
            imageErrorBuilder: (context, error, stackTrace) {
              return Image.asset(this.placeholder,fit: this.fit,);
            }) : new FadeInImage.assetNetwork(
            placeholder: this.placeholder,
            width: this.width,
            image: this.image,
            fit: this.fit,
            imageErrorBuilder: (context, error, stackTrace) {
              return Image.asset(this.placeholder,fit: this.fit,width: this.width,);
            });
      }
      @override
      Widget build(BuildContext context) {
        return _cacheImage();
      }
    }
    

    初始化必填项仅为网络图片地址

    new GeneralFadeInImage(image: url)
    

    最后封装一个缓存管理类,实现获取缓存图片大小及清除缓存图片功能,ImageCache还可获取缓存图片的数量、设置缓存的图片最大数量(默认是1000)等api。

    import 'package:flutter/cupertino.dart';
    
    class WSLCacheImageManager {
      //读取图片缓存大小
      static String getAllSizeOfCacheImages(){
        ImageCache? imageCache = PaintingBinding.instance!.imageCache;
        String cacheSizeStr = '0 kb';
        if(imageCache != null) {
          int byte = imageCache.currentSizeBytes;
          if(byte >= 0 && byte < 1024) {
            cacheSizeStr = '$byte B';
          } if(byte >= 1024 && byte < 1024 * 1024) {
            double size = (byte * 1.0 / 1024);
            String sizeStr = size.toStringAsFixed(2);
            cacheSizeStr = '$sizeStr KB';
          }else {
            double size = (byte * 1.0 / 1024) / 1024;
            String sizeStr = size.toStringAsFixed(2);
            cacheSizeStr = '$sizeStr MB';
          }
        }
        return cacheSizeStr;
      }
    
      //清除所有图片缓存
      static void clearAllCacheImage(){
        ImageCache? imageCache = PaintingBinding.instance!.imageCache;
        if(imageCache != null) {
          imageCache.clear();
        }
      }
    }
    

    好了,文章没有太多技术含量,纯属个人使用总结,或许有的朋友也会有过类似的思考。写下来,记录一下,代码拙劣,大神勿喷,如果对大家有帮助,更是深感欣慰。


    下载网 » 关于 Flutter 网络图片加载与缓存使用过程总结 |8月更文挑战

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元