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
相关产品推荐
相关产品推荐

