flutter - 来自API的Flutter离线缓存JSON响应

标签 flutter dart

我正在尝试将api的json响应保存到设备。现在,我正在创建一个文本文件,每当我调用api时,我都会覆盖文本文件以保存响应。无论何时离线或任何问题,我都会从文件返回响应。问题是,我应该这样做吗?如果没有,什么是更好的选择?

class EventRepository {
  Future<EventResponse> getEvents({page}) async {
    try {
      var response = await apiCall.getData('events?page=$page&limit=10&q=');
      var data = response.data;
      if (page == 1) {
        await CacheStorage().writeCache(jsonEncode(data), "events");
      }
      return EventResponse.fromJson(data, isCache: false);
    } catch (error, stacktrace) {
      var eventData;
      print("Exception occured: $error stackTrace: $stacktrace");
      var events = await CacheStorage().readCache("events");
      if (events != null) {
        eventData = json.decode(events);
        return EventResponse.fromJson(eventData);
      } else {
        return EventResponse.withError(handleError(error));
      }
    }
  }
}
这是我的文件读写功能:
class CacheStorage {
  Future<String> readCache(String fileName) async {
    String text;
    try {
      final Directory directory = await getApplicationDocumentsDirectory();
      final File file = File('${directory.path}/$fileName.txt');
      text = await file.readAsString();
    } catch (e) {
      text = null;
    }
    return text;
  }

  writeCache(String text, String path) async {
    final Directory directory = await getApplicationDocumentsDirectory();
    final File file = File('${directory.path}/$path.txt');
    await file.writeAsString(text);
  }
}

最佳答案

好吧,我建议您使用shared_preferences,它很容易存储和缓存喜欢的项目以及很少的东西,例如当我们不得不使用暗或亮模式时。因此,您还可以保存json对象,并且它非常安静,简单。因此,您不必每次都创建文本文件。
首先,您需要在pubspec中获取软件包,然后

import 'package:shared_preferences/shared_preferences.dart';

SharedPreferences prefs = await SharedPreferences.getInstance();
现在要保存的json数据是
prefs.setString('mydata', json.encode(yourjsondata));
要检索此数据,您必须使用分配的确切名称,在我的情况下为“mydata”
json.decode(preferences.getString('mydata'))
完成这就是全部。好,感谢您,在阅读您提出的问题时我有了这个主意。希望这会有所帮助:)

关于flutter - 来自API的Flutter离线缓存JSON响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62930221/

相关文章:

flutter 'MySQL' 未被识别为内部或外部命令

dart - 有没有办法限制 Navigation Stack 在 Flutter App 中可以维护的页面数量?

flutter - 自定义 flutter 工具提示

flutter - 如何从 List<Map<String, dynamic>> 在 Flutter 中获取值

flutter - 我如何在Flutter中将数据发送到文本字段

dart - 如何在 Dart 中解析时区 ID?

flutter - 如何在Flutter中通过提供者使用textEditiing Controller

android - 我在 flutter 中遇到 gradle 问题。无法打开设置文件的设置通用类缓存

listview - Flutter:水平 ListView 的最小高度

firebase - 如何将 Future 变量分配给 Flutter 中的类 getter