原创首发
Flutter 存储键值数据 SharePreference

我们小时候在做android开发的时候,经常用sharePreference来存储一些缓存呀,一些token之类的。
在Flutter里怎么存储呢?
昨天的文章里,写到了http请求的拦截器
那么我们拦截到的token需要存储,发起请求的时候,需要携带token。
这个时候用sharepreference再适合不过了!
添加依赖
dependencies:
shared_preferences: ^2.2.2
然后下载依赖
编写工具类
sp_utils.dart
import 'package:shared_preferences/shared_preferences.dart';
class StorageUtil {
static SharedPreferences? _prefs;
static Future init() async {
_prefs = await SharedPreferences.getInstance();
}
static Future setString(String key, String value) async =>
await _prefs?.setString(key, value);
static String? getString(String key) => _prefs?.getString(key);
static Future setBool(String key, bool value) async =>
await _prefs?.setBool(key, value);
static bool? getBool(String key) => _prefs?.getBool(key);
static Future remove(String key) async => await _prefs?.remove(key);
static Future clear() async => await _prefs?.clear();
}
使用示例子
初始化
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await StorageUtil.init();
runApp(const MyApp());
}
存储和携带令牌的地方
// 添加拦截器
_dio.interceptors.add(
InterceptorsWrapper(
onRequest: (options, handler) {
options.headers['sob-ut'] = StorageUtil.getString('sob-ut');
// 请求前处理,如添加token
debugPrint('Request: ${options.method} ${options.path}');
return handler.next(options);
},
onResponse: (response, handler) {
var header = response.headers['sob-ut'];
debugPrint('header: $header');
if (header != null) {
String token = header[0];
StorageUtil.setString('sob-ut', token);
}
debugPrint('Response: ${response.statusCode}');
return handler.next(response);
},
onError: (DioException e, handler) {
debugPrint('Error: ${e.message}');
return handler.next(e);
},
),
);
比如说我在页面加载的时候,我会判断是否有登录,先拿到令牌,然后检查令牌的有效性,如果有效的,那么进入首页。如果无效果,那么进入到登录页面去。