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

Flutter SecureStorage调用deleteAll触发bad base-64异常求助

解决方案

1. 替换deleteAll为逐个删除已知键

错误触发在deleteAll调用时,底层会先执行getAll读取所有数据,损坏的加密数据导致base64解析失败。直接删除已知的存储键,跳过读取所有数据的步骤:

修改SecureStorageService的clear方法:

Future<bool> clear() async {
  // 替换为你实际使用的存储键
  const storedKeys = ['email', 'jwt_token'];
  for (final key in storedKeys) {
    await flutterSecureStorage.delete(
      key: key,
      aOptions: const AndroidOptions(encryptedSharedPreferences: true)
    );
  }
  return true;
}

2. 阻止加密SharedPreferences被自动备份

Android自动备份会在卸载重装后恢复旧的加密数据,而新环境的加密密钥已重置,导致数据无法解析。在AndroidManifest.xml中配置备份规则:

<application
    ...
    android:allowBackup="true"
    android:fullBackupContent="@xml/backup_rules">

在res/xml/backup_rules.xml中添加排除规则:

<?xml version="1.0" encoding="utf-8"?>
<full-backup-content>
    <!-- 排除flutter_secure_storage的加密存储文件 -->
    <exclude domain="sharedpref" path="FlutterSecureStorage"/>
</full-backup-content>

若不需要自动备份,可直接设置android:allowBackup="false"。

3. 捕获异常并强制重置加密存储

针对bad base-64异常,手动删除加密存储文件彻底重置:

import 'dart:io';
import 'package:path_provider/path_provider.dart';
import 'package:flutter/services.dart';

Future<bool> clear() async {
  try {
    await flutterSecureStorage.deleteAll(
      aOptions: const AndroidOptions(encryptedSharedPreferences: true)
    );
    return true;
  } on PlatformException catch (e) {
    if (e.message?.contains('bad base-64') ?? false) {
      // 定位并删除加密SharedPreferences目录
      final appSupportDir = await getApplicationSupportDirectory();
      final securePrefsDir = Directory('${appSupportDir.path}/shared_prefs/FlutterSecureStorage');
      if (securePrefsDir.existsSync()) {
        securePrefsDir.deleteSync(recursive: true);
      }
      return true;
    }
    rethrow;
  }
}

4. 排查设备特定兼容性问题

OxygenOS 13的加密存储可能存在特殊行为,可暂时关闭encryptedSharedPreferences测试(仅用于排查,不建议长期生产使用):

flutterSecureStorage = const FlutterSecureStorage(
    aOptions: AndroidOptions(
  encryptedSharedPreferences: false,
));

若问题消失,可向flutter_secure_storage提交设备兼容性Issue。


原因分析

  • 错误核心是加密SharedPreferences数据损坏,deleteAll依赖getAll读取所有键时触发base64解析失败。
  • 卸载重装后错误重现,是因为Google Play或OxygenOS的自动备份恢复了损坏的旧加密数据,而系统清除应用数据会彻底删除这些损坏文件。
  • 你之前模拟清除数据的代码仅操作了缓存和应用支持目录,未触及加密SharedPreferences的存储位置,因此无效。

内容的提问来源于stack exchange,提问作者Caio Sant'Anna

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 13:15:51