Flutter Requests库升级后应用退出时Cookie无法存储问题咨询
解决方案
不需要更换依赖包,该问题是flutter_requests 4.x 版本调整默认逻辑导致的,手动补全配置即可复现3.3.0版本的Cookie持久化效果。
根因说明
3.3.0版本默认绑定了应用生命周期监听,会在应用退出、退后台时自动把内存中的Cookie写入本地存储;4.4.1版本移除了这层默认绑定,默认维护的是内存级CookieJar,进程销毁后内存数据直接回收,不会主动落盘,才会出现退出后Cookie丢失的问题。
具体操作步骤
- 替换默认内存CookieJar为持久化实现
初始化Requests时不要使用默认的CookieJar实例,手动传入PersistCookieJar并指定本地存储路径,示例代码:
- 替换默认内存CookieJar为持久化实现
import 'package:path_provider/path_provider.dart'; import 'package:requests/requests.dart'; import 'package:requests/src/cookie_jar.dart'; // 应用启动初始化时执行 void initRequests() async { final appDocDir = await getApplicationDocumentsDirectory(); final cookieJar = PersistCookieJar( persistSession: true, storage: FileStorage('${appDocDir.path}/.cookies/'), ignoreExpires: false, ); Requests.cookieJar = cookieJar; }
- 手动绑定生命周期触发持久化
给应用根Widget挂载WidgetsBindingObserver,重写生命周期回调,在应用退后台、退出进程前主动调用Cookie持久化方法,示例代码:
- 手动绑定生命周期触发持久化
class _MyAppState extends State<MyApp> with WidgetsBindingObserver { @override void initState() { super.initState(); WidgetsBinding.instance.addObserver(this); } @override void dispose() { WidgetsBinding.instance.removeObserver(this); super.dispose(); } @override void didChangeAppLifecycleState(AppLifecycleState state) { super.didChangeAppLifecycleState(state); // 应用退到后台、即将退出进程时主动落盘Cookie if (state == AppLifecycleState.paused || state == AppLifecycleState.detached) { Requests.cookieJar.persistSession(); } } @override Widget build(BuildContext context) { // 原有根Widget构建逻辑 return MaterialApp(); } }
- 边缘场景兼容
4.4.1版本中Cookie是在请求响应返回后异步写入Jar实例的,如果存在请求刚完成就立刻杀进程的场景,可以在关键登录、身份校验类请求的回调中,提前手动调用一次persistSession(),避免极端场景下Cookie写入不及时。
- 边缘场景兼容
不需要降级版本,也不需要替换网络库,以上配置完成后Cookie存储逻辑和3.3.0版本完全一致,不会出现兼容性问题。
内容的提问来源于stack exchange,提问作者Santhosh Mg
相关产品推荐
相关产品推荐

