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

如何从Shared Preferences获取不带方括号的字符串列表

问题解决方案

问题根源

  1. 嵌套列表导致方括号:你在setStringList里用stringList.add(prefs.getStringList("key")),相当于把整个["value"]列表作为单个元素塞进了stringList,最终stringList变成了[[value]]这种嵌套结构,所以展示时会带方括号。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 19:10:47