如何在设备 Flutter 中保存缓存

Posted

技术标签:

【中文标题】如何在设备 Flutter 中保存缓存【英文标题】:How to save cache in device Flutter 【发布时间】:2020-05-21 03:44:03 【问题描述】:

我是 Flutter 新手,这是我在 Flutter 中的第一个项目。我想做一个项目,一旦从 API 加载数据,它们就会缓存在设备中。下次即使我的设备离线,它也可以非常快速地加载。我在这里可以使用 Dio 包和 dio 缓存管理器包来缓存服务器的 json 响应。然后使用缓存图片包缓存图片。任何人都可以给我一些如何编写代码的例子吗?提前致谢

【问题讨论】:

为什么不将数据保存在 sqlite db 中......它是用户设备的本地 你可以使用moor。 @DAMMAK 谢谢你的回复,你的意思是把我的 API 响应保存到 sqlite 中?对不起,我是第一次使用颤振 @JohnJoe 感谢您的回复。我的数据来自 API,也可以使用 is package 吗?对不起,我是第一次使用颤振 使用共享偏好来存储响应 【参考方案1】:

是的,我会推荐用于颤振的 sqflite 包,我刚刚想出了如何使用它来解决同样的问题!我是通过这个 YouTube 视频了解到的:https://youtu.be/1BwjNEKD8g8。

【讨论】:

感谢您的回复,我想做类似 facebook 的项目。离线时,帖子仍然保留在那里。如果在线可以加载新帖子。所有数据均来自 API。也可以用sqlite? 我不知道...我还是编码新手!我只知道在我的项目中我只想在本地保存数据,而 sqflite 对此非常有效。抱歉,我无法提供更多帮助!【参考方案2】:

尝试共享偏好https://pub.dev/packages/shared_preferences,

只需将您的响应解码为 string 并保存到 sharePreference, 并在需要时将该字符串编码为对象。

import 'package:shared_preferences/shared_preferences.dart'; 

//storing response as string
SharedPreferences sharedPref = await SharedPreferences.getInstance();
            Map decode_options = jsonDecode(jsonString);
            String user = jsonEncode(User.fromJson(decode_options));
            sharedPref.setString('user', user);//storing

//getting string and converting into Object
SharedPreferences sharedPref = await SharedPreferences.getInstance();
            Map userMap = jsonDecode(sharedPref.getString('user')); //retriving
            var user = User.fromJson(userMap);

    class User 
      final String name;
      final String age;

      User(this.name, this.age);

      factory User.fromJson(Map<String, dynamic> parsedJson) 
        return new User(
            name: parsedJson['name'] ?? "",
            age: parsedJson['age'] ?? "");
      

      Map<String, dynamic> toJson() 
        return 
          "name": this.name,
          "age": this.age
        ;
      
    

【讨论】:

谢谢你的回复,我能知道jsonString是从哪里来的吗?因为我收到未定义名称“jsonString”的错误。尝试将名称更正为已定义的名称,或定义名称。 jsonstring 是来自服务调用的响应 json 我需要把 SharedPreferences 放在模型类代码这里还是 http 响应那里? 在屏幕“例如:Loginpage.dart”类中使用 ShrPref 以获得响应 先生,我把我的代码放在上面,我已经将 SharedPreferences 添加到代码中,但是当我离线时它只显示加载。你能检查一下我把 SharedPreferences 放错了吗?【参考方案3】:

在 Flutter 中进行缓存的另一种最佳方式是使用 hive。 它检索数据的速度比 Sqflite 和共享首选项更快

例如,你可以查看这个 GitHub 仓库:https://github.com/shashiben/Anime-details

这将展示如何将其余 API 数据缓存到 hive 中,并且下一次它将显示来自 hive 的数据。

我认为这个答案对你有帮助

【讨论】:

我的 API 数据在分页中。 Hive 也可以保存吗?

以上是关于如何在设备 Flutter 中保存缓存的主要内容,如果未能解决你的问题,请参考以下文章

如何在flutter mobile中保存网站以供离线使用

如何在颤动中将 ImageCache 保存到磁盘?

Flutter Desktop - flutter-desktop-embedding 如何将文件保存到硬盘

如何在 Flutter 中缓存 Firebase 数据?

如何在flutter中使用rootBundle加载图片?

在本地管理 Flutter 应用和 Flutter Web 数据