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

Flutter中如何用SharedPreferences存储List<List<Color>>类型数据

解决Flutter中嵌套Color列表的本地存储与读取问题

问题根源

Color类并非JSON可序列化类型,直接用jsonEncode处理会触发序列化错误;而toString()存储的字符串格式松散,解析时需要手动处理格式,极易出错且维护成本高。

解决方案

核心思路是将Color对象转换为其底层的整数值(通过Color.value获取)进行存储,读取时再将整数还原为Color对象。

1. 存储嵌套Color列表

先把List<List<Color>>转换为List<List<int>>,再序列化后存入SharedPreferences:

final prefs = await SharedPreferences.getInstance();
// 将每个Color转换为对应的int值
final List<List<int>> colorValueList = predefinedGradients
    .map((gradient) => gradient.map((color) => color.value).toList())
    .toList();
// 序列化并存储
await prefs.setString('SS_BRANDCOLOR_LIST_1', jsonEncode(colorValueList));

2. 读取并还原嵌套Color列表

读取存储的JSON字符串,解析为整数列表后再转换回Color对象:

final prefs = await SharedPreferences.getInstance();
final String? storedData = prefs.getString('SS_BRANDCOLOR_LIST_1');

if (storedData != null) {
  // 解析为List<List<int>>格式
  final List<List<int>> colorValueList = List.from(
    jsonDecode(storedData).map((gradient) => List<int>.from(gradient)),
  );
  // 将整数转换回Color对象
  final List<List<Color>> restoredGradients = colorValueList
      .map((gradient) => gradient.map((value) => Color(value)).toList())
      .toList();
  // 此处可使用restoredGradients
} else {
  // 无存储数据时使用默认列表
  final List<List<Color>> restoredGradients = predefinedGradients;
}

3. 封装工具方法(可选)

为了提升复用性,可将存储和读取逻辑封装为工具类:

class GradientStorage {
  static const String _storageKey = 'SS_BRANDCOLOR_LIST_1';

  static Future<void> saveGradients(List<List<Color>> gradients) async {
    final prefs = await SharedPreferences.getInstance();
    final colorValues = gradients
        .map((gradient) => gradient.map((color) => color.value).toList())
        .toList();
    await prefs.setString(_storageKey, jsonEncode(colorValues));
  }

  static Future<List<List<Color>>> loadGradients(
      List<List<Color>> defaultValue) async {
    final prefs = await SharedPreferences.getInstance();
    final storedData = prefs.getString(_storageKey);
    
    if (storedData == null) return defaultValue;

    final colorValues = List.from(
      jsonDecode(storedData).map((gradient) => List<int>.from(gradient)),
    );
    return colorValues
        .map((gradient) => gradient.map((value) => Color(value)).toList())
        .toList();
  }
}

// 使用示例
// 存储
await GradientStorage.saveGradients(predefinedGradients);
// 读取
final gradients = await GradientStorage.loadGradients(predefinedGradients);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 15:36:18