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

Flutter中List<String>转Map<String, List>适配GroupListView

解决方案

步骤1:解析SharedPreferences中的JSON字符串列表

从SharedPreferences获取的lb是字符串列表,每个元素对应单个JSON对象的字符串,需要先将每个字符串解析为可操作的Map对象:

import 'dart:convert';

// 异步方法内执行
SharedPreferences pref = await SharedPreferences.getInstance();
List<String>? lb = pref.getStringList('bookmarks_key');
if (lb == null || lb.isEmpty) {
  // 处理空数据场景
  return {};
}

// 遍历解析每个JSON字符串
List<Map<String, dynamic>> parsedItems = lb.map((item) {
  return jsonDecode(item) as Map<String, dynamic>;
}).toList();

步骤2:按surah_name分组,收集对应verse_no

初始化空Map,遍历解析后的列表,将每个条目里的verse_no归类到对应surah_name的列表中:

Map<String, List<dynamic>> groupedMap = {};

for (var item in parsedItems) {
  String surahName = item['surah_name'] as String;
  dynamic verseNo = item['verse_no'];

  // 若key不存在,先初始化空列表
  groupedMap.putIfAbsent(surahName, () => []);
  groupedMap[surahName]!.add(verseNo.toString()); // 统一转为字符串,匹配目标结构
}

完整可运行代码

import 'dart:convert';
import 'package:shared_preferences/shared_preferences.dart';

Future<Map<String, List<String>>> getGroupedBookmarks() async {
  SharedPreferences pref = await SharedPreferences.getInstance();
  List<String>? lb = pref.getStringList('bookmarks_key');
  
  if (lb == null || lb.isEmpty) {
    return {};
  }

  List<Map<String, dynamic>> parsedItems = lb.map((item) {
    // 捕获解析异常,避免单个错误数据影响整体
    try {
      return jsonDecode(item) as Map<String, dynamic>;
    } catch (e) {
      print('JSON解析失败: $e');
      return {};
    }
  }).where((item) => item.isNotEmpty).toList(); // 过滤解析失败的空对象

  Map<String, List<String>> groupedMap = {};
  for (var item in parsedItems) {
    String? surahName = item['surah_name'] as String?;
    dynamic verseNo = item['verse_no'];
    
    if (surahName == null || verseNo == null) {
      continue; // 跳过缺少必要字段的条目
    }

    groupedMap.putIfAbsent(surahName, () => []);
    groupedMap[surahName]!.add(verseNo.toString());
  }

  return groupedMap;
}

补充说明

  • 代码中加入了异常捕获和空值检查,避免数据异常导致崩溃;
  • 通过verseNo.toString()将所有章节号转为字符串,和你给出的目标结构完全匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 21:36:36