📅  最后修改于: 2023-12-03 15:30:27.360000             🧑  作者: Mango
Dio 是一款基于 Flutter 的网络请求库,提供了丰富的功能和易用的 API,支持各种请求方式和数据格式。它的缓存机制也是很重要的一个功能,可以提高网络请求的效率和稳定性。
Dio 支持多种缓存策略,可以根据需求选择合适的策略,或自定义缓存规则。它提供了以下几种缓存策略:
Options.connectTimeout
:连接超时时间,单位为毫秒Options.receiveTimeout
:响应超时时间,单位为毫秒Options.extra
:扩展信息Options.headers
:请求头信息Options.method
:请求方式Options.data
:请求数据Options.queryParameters
:查询参数Options.contentType
:请求的 content-type 类型Options.responseType
:响应数据类型Options.validateStatus
:自定义验证状态码合法性的方法Options.followRedirects
:是否自动跟随重定向Options.maxRedirects
:最大重定向次数Options.requestEncoder
:将请求数据编码为字符串的方法Options.responseDecoder
:将响应数据解码为对象的方法Options.listFormat
:将查询参数转为字符串时数组的展开方式Dio 支持请求数据时的缓存和响应数据的缓存,可以通过设置 Options.extra
属性,指定缓存时间、缓存文件路径等参数来控制缓存交互。
DioCacheManager
来缓存网络请求的数据,可以指定缓存时间和路径等参数,提高网络请求效率,并可以在没有网络连接的情况下提供缓存数据。Future<Response<dynamic>> get(BuildContext context) async {
final dio = Dio(BaseOptions(extra: {'cacheOptions': CacheOptions(expiry: const Duration(days: 7))}));
final cacheManager = await CacheManager.getInstance();
dio.interceptors.add(CacheInterceptor(requestPayload: true, cacheStore: await cacheManager.getStore()));
final url = 'https://www.example.com/api/...';
final response = await dio.get<dynamic>(url);
return response;
}
Options.extra['cacheOptions']
属性来缓存网络请求的响应数据,可以存储在内存或文件中,提供下一次访问时的缓存数据。Future<Response<dynamic>> get(BuildContext context) async {
final dio = Dio();
dio.interceptors.add(CacheInterceptor(requestPayload: true));
final url = 'https://www.example.com/api/...';
final response = await dio.get<dynamic>(url, options: Options(extra: {'cacheOptions': CacheOptions(priority: CachePriority.normal)}));
return response;
}
Dio 支持将缓存数据存储在内存或文件系统中,可以通过设置不同的缓存存储方式,提供不同的缓存性能和稳定性。
MemoryCacheStore
存储缓存数据,可以快速获取缓存数据,并能够较快将数据从内存中删除或更新。final cacheManager = CacheManager(
Config(
'myapp',
stalePeriod: const Duration(days: 30),
maxNrOfCacheObjects: 20,
repo: MemCacheStore(),
),
);
JsonCacheStore
存储缓存数据,可以将缓存数据保存到文件系统中,有较高的稳定性和可靠性,但读写速度较慢。final cacheManager = CacheManager(
Config(
'myapp',
stalePeriod: const Duration(days: 30),
maxNrOfCacheObjects: 20,
repo: JsonCacheStore(),
fileService: FileService(),
),
);
Dio 的缓存颤动即为当需要请求数据时,先从缓存中获取数据,同时也发起网络请求,当网络请求返回数据后,缓存中的数据会自动更新,实现了缓存颤动的效果。
final cacheOptions = CacheOptions(store: MemoryCacheStore(), policy: CachePolicy.refreshExpire);
final dio = Dio(BaseOptions(
baseUrl: 'https://jsonplaceholder.typicode.com/',
connectTimeout: 5000,
receiveTimeout: 100000,
headers: <String, dynamic>{
'User-Agent': 'dio',
'Common-Header': 'xxx',
},
contentType: Headers.jsonContentType,
responseType: ResponseType.json,
followRedirects: false,
maxRedirects: 5,
requestEncoder: (_, __) => utf8.encode(_),
responseDecoder: (_, __) => utf8.decode(_),
));
d('Get User Object Example', () async {
final response = await dio.get('/users/1',
options: Options(
extra: {'cacheOptions': cacheOptions},
headers: {'test': 'header'},
baseUrl: 'https://www.google.com/')
);
print(response.data);
});
可见,Dio 缓存颤动 机制可以帮助开发者更高效地进行网络数据获取,减少无谓的请求和响应,进一步减轻服务器压力,提高应用的性能和用户体验。