Flutter账号删除成功但未自动登出问题求助
问题排查与修复方案
1. 确认deleteAccount方法的返回值逻辑
核心问题大概率出在DeleteAccountProvider的deleteAccount方法中:你提到接口已返回成功响应,但如果该方法没有正确判断响应结果(比如只识别200状态码,而接口返回的是203),会导致response变量为false,进而跳过登出流程。
检查并修复provider中的逻辑示例:
Future<bool> deleteAccount(BuildContext context, String token, String email) async { try { final response = await http.post( Uri.parse('你的账号删除接口地址'), headers: {'Authorization': 'Bearer $token'}, body: {'email': email}, ); // 匹配接口返回的203状态码和success字段 if (response.statusCode == 203) { final data = jsonDecode(response.body); return data['success'] == 1; } return false; } catch (e) { return false; } }
2. 修复logout函数的上下文问题
当前logout函数直接使用widget的context,但调用登出时,可能因弹窗关闭导致widget已处于未挂载状态(mounted为false),进而跳过状态清理和页面跳转。
修改方案:给logout传入有效上下文,并调整逻辑顺序:
// 在deleteUserAccount中调用logout时传入context await logout(context, prefs); // 修改后的logout函数 Future<void> logout(BuildContext context, SharedPreferences prefs) async { if (kDebugMode) { print('Language Code After Logout: ${prefs.getString('languageCode')}'); } // 先清理全局状态,无需依赖widget挂载状态 context.read<UserProvider>().clearUserData(); // 移除登录token await prefs.remove("user_login_token"); // 确保上下文有效时执行页面跳转 if (context.mounted) { Navigator.pushAndRemoveUntil( context, MaterialPageRoute( builder: (context) => const OnBoardingScreen(), ), (route) => false, ); } }
3. 添加调试日志定位问题
在deleteUserAccount中插入日志,确认流程是否走到登出步骤:
final response = await deleteAccountProvider.deleteAccount(context, userToken ?? '', email ?? ''); print("账号删除接口返回结果:$response"); // 验证是否为true if (response) { print("开始执行登出流程"); await logout(context, prefs); }
内容的提问来源于stack exchange,提问作者Mansoor Malik
相关产品推荐
相关产品推荐

