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

如何解决Flutter开发中Shared Preferences无法正常生效的问题

问题原因

你遇到的无响应问题核心由以下几个原因导致:

  1. 空值强制解包崩溃:你在读取SharedPreferences数据时直接使用!强制解包可空类型,如果对应key的值还没写入、或者缓存被清空,读取时会直接抛出空异常,导致页面无响应甚至闪退
  2. 异步时序问题:首页initState中调用的setData()是异步方法,不会等待执行完成就会继续渲染页面,如果你打开应用立刻点击跳转按钮进入第二个页面,此时数据还没写入完成,读取就会拿到空值触发崩溃
  3. 导入冗余冲突:首页代码中同时导入了绝对路径和相对路径的another_screen.dart,部分编译环境下会出现资源识别异常

修复方案

1. 清理冗余导入

删除首页中重复的导入语句,只保留其中一个即可:

// 删除其中一行导入
import 'package:flutter_application_2/another_screen.dart';
import 'another_screen.dart';

2. 替换强制解包为安全取值

修改第二个页面的getData()方法,给所有可空类型设置默认值,避免空异常:

getData() async {
  try {
    SharedPreferences _pref = await SharedPreferences.getInstance();
    setState(() {
      _name = _pref.getString('name') ?? '';
      _age = _pref.getInt('age');
      _university = _pref.getString('university') ?? '';
      _height = _pref.getInt('height');
      _skills = _pref.getStringList('skills') ?? ['', ''];
    });
  } catch (e) {
    // 开发阶段可以打印错误日志排查问题
    debugPrint('读取SharedPreferences出错: $e');
  }
}

3. 优化异步时序(可选,避免首次启动读取失败)

如果需要保证进入应用时数据已经写入完成,可以将SharedPreferences初始化和数据写入提前到main函数中:

void main() async {
  // 确保Flutter引擎初始化完成
  WidgetsFlutterBinding.ensureInitialized();
  // 提前初始化并写入固定数据
  final pref = await SharedPreferences.getInstance();
  pref.setString('name', 'Rady');
  pref.setInt('age', 19);
  pref.setString('university', 'Rady');
  pref.setInt('height', 19);
  pref.setStringList('skills', ['Dart', 'Flutter']);
  runApp(const MyApp());
}

修改后可以删除首页initState中调用的setData()方法以及对应的方法实现,避免重复写入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 11:06:05