如何从Shared Preferences获取不带方括号的字符串列表
问题解决方案
问题根源
- 嵌套列表导致方括号:你在
setStringList里用stringList.add(prefs.getStringList("key")),相当于把整个["value"]列表作为单个元素塞进了stringList,最终stringList变成了[[value]]这种嵌套结构,所以展示时会带方括号。 - Get方法无效:
getStringList里既没把获取到的列表赋值给stringList,还用错了存储的key(写的kfzs,实际存的是key)。
修正后的完整代码
import 'package:flutter/material.dart'; import 'package:shared_preferences/shared_preferences.dart'; class PrefListViewBuilder extends StatefulWidget { const PrefListViewBuilder({Key? key}) : super(key: key); @override State<PrefListViewBuilder> createState() => _PrefListViewBuilderState(); } class _PrefListViewBuilderState extends State<PrefListViewBuilder> { // 指定类型为List<String>,避免类型歧义 List<String> stringList = []; setStringList() async { SharedPreferences prefs = await SharedPreferences.getInstance(); await prefs.setStringList("key", <String>["value"]); setState(() { // 直接替换整个列表,而非添加嵌套元素,空值时用空列表兜底 stringList = prefs.getStringList("key") ?? []; }); print(stringList); } getStringList() async { SharedPreferences prefs = await SharedPreferences.getInstance(); setState(() { // 使用正确的key,并赋值给stringList stringList = prefs.getStringList("key") ?? []; }); print(stringList); } @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.grey, body: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ TextButton( onPressed: setStringList, child: const Text("Set"), ), TextButton( onPressed: getStringList, child: const Text("Get"), ), ], ), const SizedBox(height: 20), Text(stringList.toString()), const SizedBox(height: 20), Container( color: Colors.white, child: ListView.builder( shrinkWrap: true, itemCount: stringList.length, itemBuilder: (context, index) { return Padding( padding: const EdgeInsets.all(10), child: Container( color: Colors.blue, child: Text(stringList[index]), ), ); }, ), ), ], ), ); } }
核心修改说明
- 修正列表赋值方式:把
stringList.add(...)改成stringList = ...,直接用SharedPreferences返回的列表替换当前列表,避免嵌套。 - 修复Get方法逻辑:给
stringList正确赋值,同时调用setState触发UI更新,并且使用了存储时的正确key。 - 明确类型定义:将
List stringList = []改为List<String> stringList = [],让类型更清晰,避免后续操作的类型问题。 - 空值兜底:用
?? []处理SharedPreferences返回null的情况,防止空指针异常。
内容的提问来源于stack exchange,提问作者OverdoseB12
相关产品推荐
相关产品推荐

