Flutter网络请求缓存修复插件dio_http_cache_fix的使用
Flutter网络请求缓存修复插件dio_http_cache_fix的使用
dio-http-cache
是一个用于 Dio ( http 客户端)
的缓存库。类似于 Android 中的 Rxcache
。
dio-http-cache
使用 sqflite
作为磁盘缓存,并使用 LRU
策略作为内存缓存。
灵感来源于 flutter_cache_manager
。
添加依赖
在 pubspec.yaml
文件中添加依赖:
dependencies:
dio_http_cache: ^0.3.x #最新版本
快速开始
1. 在 Dio 中添加 dio-http-cache 拦截器
dio.interceptors.add(DioCacheManager(CacheConfig(baseUrl: "http://www.google.com")).interceptor);
2. 设置请求的最大缓存时间
Dio().get(
"http://www.google.com",
options: buildCacheOptions(Duration(days: 7)),
);
高级用法
自定义配置通过 buildCacheOptions
primaryKey
默认情况下,host + path
用作 primaryKey,也可以自定义它。
buildCacheOptions(Duration(days: 7), primaryKey: "custom_key")
subKey
默认情况下,查询(data 或 queryParameters)用作 subKey,必要时可以指定 subKey。
buildCacheOptions(Duration(days: 7), subKey: "page=1")
maxAge
设置缓存时间。如果值为 null 或未设置,则会尝试从响应头获取 maxAge
和 maxStale
。
buildCacheOptions(Duration(days: 7), maxAge: Duration(days: 7))
maxStale
设置过期时间。在错误发生(如 500, 404)之前,如果超过最大过期时间,尝试返回缓存。
buildCacheOptions(Duration(days: 7), maxStale: Duration(days: 10))
forceRefresh
默认值为 false。
buildCacheOptions(Duration(days: 7), forceRefresh: true)
- 先从网络获取数据。
- 如果从网络获取数据成功,则存储或刷新缓存。
- 如果从网络获取数据失败或没有网络可用,则尝试从缓存获取数据而不是报错。
使用 CacheConfig
配置默认参数
baseUrl
它是可选的;如果没有在 CacheConfig
中设置 baseUrl,当你调用 deleteCache
时,你需要提供完整的路径,例如 "https://www.google.com/search?q=hello"
,而不是只提供 "search?q=hello"
。
encrypt / decrypt
这两个必须一起使用来加密磁盘缓存数据,你也可以在这里压缩数据。
defaultMaxAge
使用 Duration(day:7)
作为默认值。
defaultMaxStale
与 defaultMaxAge
类似。
databasePath
数据库路径。
databaseName
数据库名称。
skipMemoryCache
默认值为 false。
skipDiskCache
默认值为 false。
maxMemoryCacheCount
默认值为 100。
defaultRequestMethod
默认使用 “POST”,它将用于 delete caches
。
diskStore
自定义磁盘存储。
如何清除过期缓存
- 只需忽略它,这是自动的。
- 但是如果你坚持这样做:
DioCacheManager.clearExpired();
如何删除缓存
删除本地缓存(仅匹配 primaryKey)
// 自动解析 primaryKey 从路径
_dioCacheManager.deleteByPrimaryKey(path, requestMethod: "POST");
当 primaryKey 和 subKey 匹配时删除本地缓存
// 当 primaryKey 和 subKey 匹配时删除本地缓存
_dioCacheManager.deleteByPrimaryKeyAndSubKey(path, requestMethod: "GET");
重要提示:如果你在请求 HTTP 接口时有额外的参数,你必须带上它们,例如:
_dio.get(_url, queryParameters: {'k': keyword},
options: buildCacheOptions(Duration(hours: 1)))
// 删除缓存:
_dioCacheManager.deleteByPrimaryKeyAndSubKey(_url, requestMethod: "GET", queryParameters:{'k': keyword});
_dio.post(_url, data: {'k': keyword},
options: buildCacheOptions(Duration(hours: 1)))
// 删除缓存:
_dioCacheManager.deleteByPrimaryKeyAndSubKey(_url, requestMethod: "POST", data:{'k': keyword});
通过 primaryKey 和可选的 subKey 删除本地缓存
// 通过 primaryKey 和可选的 subKey 删除本地缓存
_dioCacheManager.delete(primaryKey,{subKey,requestMethod});
如何清除所有缓存(过期或未过期)
_dioCacheManager.clearAll();
如何知道数据是否来自缓存
if (null != response.headers.value(DIO_CACHE_HEADER_KEY_DATA_SOURCE)) {
// 数据来自缓存
} else {
// 数据来自网络
}
示例:maxAge 和 maxStale
_dio.post(
"https://www.example.com",
data: {'k': "keyword"},
options:buildCacheOptions(
Duration(days: 3),
maxStale: Duration(days: 7),
)
)
- 0 ~ 3 天:直接从缓存返回数据(与网络无关)。
- 3 ~ 7 天:
- 先从网络获取数据。
- 如果从网络获取数据成功,则刷新缓存。
- 如果从网络获取数据失败或没有网络可用,则尝试从缓存获取数据而不是报错。
- 7 ~ ∞ 天:不再使用缓存,缓存将在适当的时候被删除。
许可证
Copyright 2019 Hurshi
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
更多关于Flutter网络请求缓存修复插件dio_http_cache_fix的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html