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

Flutter Riverpod解密时触发空值检查_CastError问题求助

问题分析与解决方案

你的空值错误根源在EncryptData类的实现上:

  • 你用**静态成员变量encrypted**存储加密后的对象,但应用重启后这个变量初始值为null。
  • 调用decryptAES时直接用encrypted!强制解包,此时encrypted还未被赋值(加密操作仅在数据上传时执行,重启后获取数据解密时该变量并未初始化),因此触发_CastError。
  • 热重载后不报错是因为热重载不会重置静态变量,之前加密操作留下的encrypted值仍存在,解密时能正常调用。

修复方案:重构加解密工具类,移除全局静态状态

把EncryptData改成无状态实现,每个方法独立处理加密/解密流程,不再依赖全局静态变量:

import 'package:encrypt/encrypt.dart';

class EncryptData {
  // 建议将密钥存放在安全位置(如flutter_secure_storage),不要硬编码
  static const String _keyString = 'my 32 length key................';
  static final Key _key = Key.fromUtf8(_keyString);
  static final IV _iv = IV.fromLength(16);
  static final Encrypter _encrypter = Encrypter(AES(_key));

  static String encryptAES(String plainText) {
    final encrypted = _encrypter.encrypt(plainText, iv: _iv);
    return encrypted.base64;
  }

  static String decryptAES(String encryptedBase64) {
    final encrypted = Encrypted.fromBase64(encryptedBase64);
    return _encrypter.decrypt(encrypted, iv: _iv);
  }
}

调整ListView中的解密调用

原代码中仅对index=0的项解密,现在直接调用修复后的decryptAES即可(确保传入的是加密后的base64字符串):

Text(
  index == 0
      ? EncryptData.decryptAES(decodedData[index]['personName'])
      : decodedData[index]['personName'],
  style: const TextStyle(fontSize: 15, fontWeight: FontWeight.bold),
),

额外优化建议

  1. 密钥安全:硬编码密钥存在泄露风险,建议使用flutter_secure_storage存储密钥,或通过HTTPS接口从后端动态获取。
  2. 异常捕获:给解密方法添加异常处理,避免因无效加密字符串导致UI崩溃:
static String? decryptAES(String encryptedBase64) {
  try {
    final encrypted = Encrypted.fromBase64(encryptedBase64);
    return _encrypter.decrypt(encrypted, iv: _iv);
  } catch (e) {
    print('解密失败: $e');
    return '解密失败'; // 或返回默认值/空字符串
  }
}

调用时可处理异常情况:

Text(
  index == 0
      ? EncryptData.decryptAES(decodedData[index]['personName']) ?? '未知名称'
      : decodedData[index]['personName'],
  style: const TextStyle(fontSize: 15, fontWeight: FontWeight.bold),
),

内容的提问来源于stack exchange,提问作者mesh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 15:05:22