Flutter中SharedPreferences赋值后变量显示null,函数内打印正常
问题原因分析及修复方案
核心问题原因
变量作用域错误
你把email变量声明在build方法内部,每次build执行时(比如调用setState后),email都会被重新初始化为空字符串。即使setState更新了它的值,下一次build触发时又会被重置,导致Text组件始终显示初始空值。异步操作时序问题
getEmail是异步函数,当你点击按钮调用getEmail()后立即执行print(email),此时await SharedPreferences.getInstance()的异步操作还未完成,email还没被更新,所以打印的是旧的空值。异步函数不会阻塞后续代码执行,print语句会先于setState执行。函数位置不当
把getEmail定义在build方法内,每次build都会重新创建这个函数,既浪费资源,也容易引发意外行为。
修复后的代码示例
class Example extends StatefulWidget { const Example({Key? key}) : super(key: key); @override State createState() => _ExampleState(); } class _ExampleState extends State<Example> { String? email = ''; // 将email作为状态类的成员变量 @override void initState() { super.initState(); getEmail(); // 组件初始化时自动加载本地数据 } void getEmail() async { SharedPreferences prefs = await SharedPreferences.getInstance(); setState(() { email = prefs.getString('username'); }); print(email); // 此处打印会得到正确值,已等待异步操作完成 } @override Widget build(BuildContext context) { FirebaseAuth auth = FirebaseAuth.instance; return Scaffold( body: SafeArea( child: Column( children: [ TextButton( onPressed: getEmail, // 直接调用函数即可 child: const Text('click'), ), Text('${email}'), ], ), ), ); } }
关键修复点说明
- 将
email移到_ExampleState类中作为成员变量,确保其生命周期与组件一致,不会被重复初始化。 - 在
initState中调用getEmail,组件加载时自动获取本地数据,无需用户手动点击按钮。 - 把
getEmail函数移到build方法外,避免重复创建函数。 - 若需要打印更新后的
email,应在getEmail内部的异步操作完成后执行,而非在按钮点击事件中立即调用。
内容的提问来源于stack exchange,提问作者Ja'afar Zakariya
相关产品推荐
相关产品推荐

