Flutter项目如何全局设置token实现全项目范围访问
Flutter 全局Token配置方案
首先你可以从认证接口的返回JSON中解析出token,示例解析代码如下:
Map<String, dynamic> loginResponse = {"token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJSREUiLCJleHAiOjE2MjQ4OTE0OTEsInN1YiI6ImFzaHdtZWdoIiwicm9sZSI6IkNsaWVudCIsImF1ZCI6IlJERSIsInB3ZGNoIjpmYWxzZSwiaXAiOiIyMjMuMjI2LjIyMy4xODYifQ.mZ1jUM3t0gqYAQKTkHXqJ_sGy7m2FBeF4P7cCmBvuWA"}; String userToken = loginResponse['token'];
你可以根据项目规模选择以下任意一种方案实现token全局访问:
方案1:全局常量类(适合小型快速开发项目)
- 新建
global.dart文件,定义静态存储类:
class Global { // 全局存储token static String? token; }
- 登录成功后直接赋值:
Global.token = userToken;
- 后续发API请求时直接取全局变量填充请求头:
headers: { 'Authorization': 'Bearer ${Global.token}' }
注意:该方案仅保存在运行内存中,APP重启后token会丢失,需要搭配本地持久化使用
方案2:状态管理全局注入(适合中大型规范项目)
以常用的Provider状态管理为例:
- 新建
auth_provider.dart存储认证状态:
import 'package:flutter/foundation.dart'; class AuthProvider with ChangeNotifier { String? _token; String? get token => _token; // 登录成功更新token void saveToken(String newToken) { _token = newToken; notifyListeners(); } // 退出登录清空token void clearToken() { _token = null; notifyListeners(); } }
- 在
main.dart中全局注册Provider:
void main() { runApp( ChangeNotifierProvider( create: (context) => AuthProvider(), child: const MyApp(), ), ); }
- 登录成功后调用方法保存token:
Provider.of<AuthProvider>(context, listen: false).saveToken(userToken);
- 发请求时读取token:
String? token = Provider.of<AuthProvider>(context, listen: false).token;
方案3:Dio拦截器+本地持久化(生产环境推荐)
该方案可以同时实现全局自动携带token、APP重启保留登录状态、token过期自动处理等需求:
- 先通过
shared_preferences将token持久化存储到本地,登录成功后执行:
final prefs = await SharedPreferences.getInstance(); await prefs.setString('user_token', userToken);
- 封装Dio实例,添加全局拦截器,所有请求自动携带token:
import 'package:dio/dio.dart'; import 'package:shared_preferences/shared_preferences.dart'; class DioInstance { static Dio? _dio; static Dio get dio { if (_dio == null) { _dio = Dio(); // 添加请求拦截器 _dio!.interceptors.add(InterceptorsWrapper( onRequest: (options, handler) async { // 从本地读取token添加到请求头 final prefs = await SharedPreferences.getInstance(); String? savedToken = prefs.getString('user_token'); if (savedToken != null) { options.headers['Authorization'] = 'Bearer $savedToken'; } return handler.next(options); }, )); } return _dio!; } }
- 后续所有接口直接调用该Dio实例发请求即可,无需手动添加token:
// 示例GET请求 Response res = await DioInstance.dio.get('https://你的API地址/接口');
内容的提问来源于stack exchange,提问作者Divyesh mehta
相关产品推荐
相关产品推荐

