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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 08:48:16