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

Flutter中SharedPreferences无法清除数据,请求技术协助

SharedPreferences 无法清除数据的问题排查与修复

你的代码里存在几个关键错误,导致数据无法正确清除或界面未同步更新:

  • Reset按钮的setState语法错误:你写成了setState: () {},正确写法是setState(() {}),冒号改为括号,否则状态更新逻辑不会执行。
  • 异步方法未使用await:clearData()是异步操作,直接调用不等待完成的话,会出现打印旧数据、界面未及时更新的情况;Save按钮里的saveData也只是写了方法名,没有加括号调用,更没有await,导致数据可能保存失败。
  • 清除数据后未更新本地变量:即使SharedPreferences里的数据被清除,你没有更新页面状态里的savedData,界面自然还会显示旧值。

修正后的完整代码

import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';

class HomePage extends StatefulWidget {
  const HomePage({Key? key}) : super(key: key);

  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  late double? savedData = 0.0;
  final TextEditingController textController = TextEditingController();

  Future<void> retrieveData() async {
    final prefs = await SharedPreferences.getInstance();
    setState(() {
      savedData = prefs.getDouble('keydata') ?? 0.0;
    });
  }

  Future<void> saveData() async {
    final prefs = await SharedPreferences.getInstance();
    await prefs.setDouble('keydata', savedData!);
  }

  Future<void> clearData() async {
    final prefs = await SharedPreferences.getInstance();
    await prefs.clear();
    // 清除后同步更新本地状态变量
    setState(() {
      savedData = 0.0;
    });
  }

  @override
  void initState() {
    super.initState();
    // 页面初始化时自动读取已保存的数据
    retrieveData();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Test SharedPreferences'),
      ),
      body: InkWell(
        onTap: () {
          setState(() {
            FocusScope.of(context).requestFocus(FocusNode());
          });
        },
        child: Padding(
          padding: const EdgeInsets.symmetric(horizontal: 40.0),
          child: Column(
            mainAxisSize: MainAxisSize.max,
            mainAxisAlignment: MainAxisAlignment.spaceAround,
            children: [
              const Spacer(),
              TextField(
                controller: textController,
                keyboardType: const TextInputType.numberWithOptions(decimal: true),
                decoration: const InputDecoration(labelText: 'Data to save'),
              ),
              const Spacer(),
              ElevatedButton(
                onPressed: () async {
                  setState(() {
                    savedData = double.parse(textController.text);
                  });
                  await saveData();
                  textController.clear();
                },
                child: const Text('Save'),
              ),
              const Spacer(),
              Text(
                'savedData : ${savedData!.toStringAsFixed(2)}',
                style: const TextStyle(fontSize: 20),
              ),
              const Spacer(),
              ElevatedButton(
                onPressed: () async {
                  await clearData();
                  print(savedData);
                },
                child: const Text('Reset'),
              ),
              const Spacer(),
            ],
          ),
        ),
      ),
    );
  }
}

额外优化说明

  1. 新增initState方法,页面启动时自动读取SharedPreferences中的数据,确保初始显示的是已保存的值。
  2. 所有异步方法统一使用Future<void>返回类型,明确操作无返回值。
  3. retrieveData中通过setState更新状态,保证读取数据后界面同步刷新。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 18:55:29