You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 02:27:03