Flutter SharedPreferences保存TextField状态热重启重置问题
问题原因
你的代码存在3个核心错误,导致持久化逻辑完全不生效:
- SharedPreferences 键值对读写逻辑写反:存储时你用固定字符串
nama作为key、输入框内容作为value写入,但读取时错误地把输入框当前初始空文本当key去取值,永远读不到之前存的内容。 - 保存方法
setPref()从未被调用:你只定义了持久化写入的方法,没有在输入内容变化、页面退出等时机触发执行,数据根本没有被写入本地存储。 - 变量语义混乱:既用
nama当存储的固定key名,又用它承接读取到的输入内容,很容易出现逻辑写错的问题。
修正后的实现
首先确认你已经在pubspec.yaml中添加了shared_preferences依赖,之后替换为如下代码即可:
// 提前导入依赖包 import 'package:shared_preferences/shared_preferences.dart'; import 'package:flutter/material.dart'; class HomePage extends StatefulWidget { @override State<HomePage> createState() => _HomePageState(); } class _HomePageState extends State<HomePage> { // 定义固定存储key,和业务变量拆分避免写错 static const String _inputStorageKey = 'nama'; late final TextEditingController nameController; // 保存输入内容到本地 Future<void> _saveInput() async { final prefs = await SharedPreferences.getInstance(); await prefs.setString(_inputStorageKey, nameController.text); } // 读取本地存储的历史输入 Future<void> _loadSavedInput() async { final prefs = await SharedPreferences.getInstance(); final savedText = prefs.getString(_inputStorageKey) ?? ''; // 直接给controller赋值即可,无需额外setState,controller会自动触发输入框刷新 nameController.text = savedText; } @override void initState() { super.initState(); nameController = TextEditingController(); // 初始化时加载历史存储内容 _loadSavedInput(); // 监听输入变化,内容变更时自动保存 nameController.addListener(_saveInput); } @override void dispose() { // 页面销毁时移除监听、释放controller,避免内存泄漏 nameController.removeListener(_saveInput); nameController.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text('输入框持久化测试')), body: Padding( padding: const EdgeInsets.all(16.0), child: TextField( controller: nameController, decoration: const InputDecoration( hintText: '请输入内容', border: OutlineInputBorder(), ), ), ), ); } }
补充说明
- 上述实现为实时保存逻辑,输入框内容变化就会写入本地,不仅热重启不会丢失内容,杀进程重开APP、清理后台后再打开也能保留上次输入的内容。
- 不要在给
TextEditingController赋值时额外包裹setState,TextEditingController本身是可监听对象,赋值后会自动通知输入框刷新内容,额外调用setState反而会触发不必要的整页重建。 SharedPreferences存储的内容会一直保留,除非你主动删除对应key、卸载应用或者清空应用数据。
内容的提问来源于stack exchange,提问作者dendi
相关产品推荐
相关产品推荐

