如何在Flutter中没有dio的情况下缓存POST请求?

时间:2020-07-08 12:53:41

标签: flutter caching dart

我正在尝试缓存一些API调用,但到目前为止,我找不到做到这一点的最佳/最佳方法。我对此不感兴趣,因为我有很多需要缓存的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;
}

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

1 个答案:

答案 0 :(得分:0)

我同时使用了 flutter_cache_managerhttp.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);