热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

flutter内存缓存,flutter内存优化

flutter图片缓存Flutter的图片缓存机制有问题(可能是我使用的版本1.12.13有问题)网络图片会默认缓存到本地,但是不管图片是不是完整的或者损坏的,导致页面在下次进入的

flutter 图片缓存

Flutter的图片缓存机制有问题(可能是我使用的版本1.12.13有问题)

网络图片会默认缓存到本地,但是不管图片是不是完整的或者损坏的,导致页面在下次进入的时候会优先从缓存里读取图片。有些图片是没有加载完成的,或者损坏的,导致图片无法显示。UI效果就是显示成白色的。

一种解决方式:加载前或者退出后清理图片缓存

ImageCache  imageCache = PaintingBinding.instance.imageCache; 

imageCache.clear();

缺点就是每次图片都想要从网络上获取,增加服务器负担

Flutter进行本地缓存

get方法获取数据,封装存储和移除方法用于操作数据缓存列表(需要优化,仅参考)

Flutter——FadeInImage本地缓存图片

FadeInImage官方默认只支持缓存到内存中,在项目中一般都需要把图片缓存到本地文件中

通过观察 FadeInImage 的构造函数中,得知 image 是调用 ResizeImage.resizeIfNeeded(imageCacheWidth, imageCacheHeight, NetworkImage(image, scale: imageScale)) 这个方法来获得图片的,而获得 ImageProvider 又是通过 NetworkImage(image, scale: imageScale)

继续跟进发现 NetworkImage 是继承 ImageProvider 的一个抽象类,里面有个工厂构造函数

通过修改这里的源码来实现本地缓存图片

在这之前需要先导入

Flutter 本地缓存

Flutter本地存储可以用 shared_preferences ,其会根据不同操作系统进行相对应的存储。

在pubspec.yaml添加

`shared_preferences: ^2.0.13`

```d

import 'package:shared_preferences/shared_preferences.dart';

class SpUtils {

SharedPreferences?prefs;

  SpUtils._() {

init();

  }

static SpUtils?_instance;

  static preInit() {

_instance ??=SpUtils._();

  }

static SpUtilsgetInstance() {

_instance ??=SpUtils._();

    return _instance!;

  }

void init()async {

prefs ??=await SharedPreferences.getInstance();

  }

setString(String key, String value) {

prefs!.setString(key, value);

  }

setDouble(String key, double value) {

prefs!.setDouble(key, value);

  }

setInt(String key, int value) {

prefs!.setInt(key, value);

  }

setBool(String key, bool value) {

prefs!.setBool(key, value);

  }

setStringList(String key, List value) {

prefs!.setStringList(key, value);

  }

clear(String key){

prefs!.remove(key);

  }

clearAll(){

prefs!.clear();

  }

Tget(String key) {

return prefs!.get(key)as T;

  }

}

```

在项目初始页调用

`SpUtils.preInit();`

`SpUtils.getInstance().setString('userId', '12345678');`

`SpUtils.getInstance().setDouble('price', 12.88);`

`SpUtils.getInstance().setInt('count', 200);`

`SpUtils.getInstance().setBool('flag', true);`

`SpUtils.getInstance().get('userId');`

`SpUtils.getInstance().clearAll();`

`SpUtils.getInstance().clear('userId');`


推荐阅读
author-avatar
流连的瓶子
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有