面试题答案
一键面试缓存策略
- 内存缓存:在应用内存中存储近期请求的数据,下次请求相同数据时先从内存中查找。可以使用
Map
来简单实现。Map<String, dynamic> memoryCache = {}; Future<dynamic> getDataFromMemoryCache(String url) async { if (memoryCache.containsKey(url)) { return memoryCache[url]; } return null; } Future<dynamic> setDataToMemoryCache(String url, dynamic data) async { memoryCache[url] = data; return data; }
- 磁盘缓存:使用
shared_preferences
等插件将数据持久化到磁盘。这样即使应用关闭再打开,仍可使用缓存数据。import 'package:shared_preferences/shared_preferences.dart'; Future<dynamic> getDataFromDiskCache(String key) async { final prefs = await SharedPreferences.getInstance(); return prefs.get(key); } Future<bool> setDataToDiskCache(String key, dynamic value) async { final prefs = await SharedPreferences.getInstance(); if (value is String) { return prefs.setString(key, value); } else if (value is int) { return prefs.setInt(key, value); } else if (value is double) { return prefs.setDouble(key, value); } else if (value is bool) { return prefs.setBool(key, value); } else if (value is List<String>) { return prefs.setStringList(key, value); } return false; }
请求队列管理
- 使用
Queue
:可以使用dart:collection
中的Queue
来管理请求。当有新请求时,将其加入队列,依次处理。import 'dart:collection'; Queue<Future> requestQueue = Queue(); void addRequestToQueue(Future request) { requestQueue.add(request); } Future processQueue() async { while (requestQueue.isNotEmpty) { await requestQueue.removeFirst(); } }
- 限制并发请求数:防止过多请求导致网络拥塞。可以使用
StreamController
和Stream
来实现。import 'dart:async'; int maxConcurrentRequests = 3; StreamController _streamController = StreamController(); Stream get requestStream => _streamController.stream; void addRequest(Future request) { requestStream.listen((_) async { await request; _streamController.add(null); }); _streamController.add(null); } void startRequestStream() { for (int i = 0; i < maxConcurrentRequests; i++) { _streamController.add(null); } }
HTTP/3协议使用
在Flutter中,使用http
库时,若底层网络支持HTTP/3(如在支持的操作系统和网络环境下),http
库会自动使用合适的协议版本。
- 简单HTTP GET请求示例:
这里如果网络环境支持HTTP/3,import 'package:http/http.dart' as http; Future<http.Response> fetchData() async { final response = await http.get(Uri.parse('https://example.com/api/data')); if (response.statusCode == 200) { return response; } else { throw Exception('Failed to load data'); } }
http.get
方法会优先使用HTTP/3协议进行请求,从而提升网络请求速度。同时结合上述缓存策略和请求队列管理,能进一步优化整体的网络请求性能。