Flutter中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(), ], ), ), ), ); } }
额外优化说明
- 新增
initState方法,页面启动时自动读取SharedPreferences中的数据,确保初始显示的是已保存的值。 - 所有异步方法统一使用
Future<void>返回类型,明确操作无返回值。 retrieveData中通过setState更新状态,保证读取数据后界面同步刷新。
内容的提问来源于stack exchange,提问作者mbrd
相关产品推荐
相关产品推荐

