首页 > 解决方案 > 如何在 Flutter 中缓存没有 dio 的 POST 请求?

问题描述

我正在尝试缓存一些 API 调用,但到目前为止我找不到最好/最优化的方法。我对为此使用 Dio 不感兴趣,因为我有很多 API 调用需要缓存。

另外,我尝试使用async_resource它似乎是一个非常简单的插件,但它与flutter_google_places我在项目中使用的不兼容。

我看了看,flutter_cache_manager但没有找到任何关于 POST 调用的示例。

所以,这就是我执行 API 调用的方式:

var url = 'www.my-url.com/api';

var header = {
  "Content-type": "application/json",
  "key": "my-key",
  "token": "my-token"
};

var params = {
  "limit": limit,
  "page": page,
};

var _body = json.encode(params);

try {
  var response = await http.post(url, headers: header, body: _body);
  return json.decode(response.body);
} catch (e) {
  return null;
}

我应该如何缓存这些数据?

标签: fluttercachingdart

解决方案


我同时使用了这两种flutter_cache_manager方法http.post来实现这一点。

以下是我尝试过的方法,现在工作正常。

注意:确保finalUrl下面的每个标题/参数更改都有一个唯一的 url,这些更改必须在您的逻辑中生成。

String finalUrl = 'some unique url';
String tempResponse = '';
// checks if the file exists in cache
var fileInfo = await DefaultCacheManager().getFileFromCache(finalUrl);
if (fileInfo == null) {
  // get data from online if not present in cache
  http.Response response;
  try {
    var response = await http.post(url, headers: header, body: _body);;
  } catch (e) {
    print(e);
  }
  tempResponse = response.body;

  // put data into cache after getting from internet
  List<int> list = tempResponse.codeUnits;
  Uint8List fileBytes = Uint8List.fromList(list);
  DefaultCacheManager().putFile(finalUrl, fileBytes);
} else {
  // get data from file if present in cache
  tempResponse = fileInfo.file.readAsStringSync();
}
var result = json.decode(tempResponse);

推荐阅读