求助:SharedPreferences的getString返回null,setState调用后仍打印null
问题原因
你注册页面的代码里完全没有将用户名写入SharedPreferences的逻辑,只更新了Firebase Auth用户的displayName,所以后续从SharedPreferences中读取"displayName"键的值时,自然会得到null。
解决步骤
1. 补全注册页面的SharedPreferences写入逻辑
在注册成功、更新用户displayName后,添加代码将用户名存入SharedPreferences:
try { UserCredential result = await FirebaseAuth.instance.createUserWithEmailAndPassword( email: _emailController.text, password: _passwordController.text, ); final user = FirebaseAuth.instance.currentUser; final name = _usernameController.text; await user?.updateDisplayName(name); // 新增:将用户名存入SharedPreferences final prefs = await SharedPreferences.getInstance(); await prefs.setString("displayName", name); Navigator.pushNamed(context, homeRoute); print(name); } catch (e) { // 记得处理异常 print(e); }
2. 优化页面的读取逻辑
给getString设置默认值避免null,同时调整retrieve方法的写法:
void initState() { super.initState(); retrieve(); } Future<void> retrieve() async { final prefs = await SharedPreferences.getInstance(); // 设置默认值为空字符串,避免null setState(() { name = prefs.getString("displayName") ?? ""; print(name); }); }
3. 更规范的写法:使用FutureBuilder
如果不想在initState里处理异步逻辑,可以用FutureBuilder替代,更符合Flutter状态管理规范:
@override Widget build(BuildContext context) { return FutureBuilder<String?>( future: _getDisplayName(), initialData: "", builder: (context, snapshot) { if (snapshot.connectionState == ConnectionState.waiting) { return const CircularProgressIndicator(); } name = snapshot.data ?? ""; print(name); return // 你的页面布局 }, ); } Future<String?> _getDisplayName() async { final prefs = await SharedPreferences.getInstance(); return prefs.getString("displayName"); }
内容的提问来源于stack exchange,提问作者Mark McKeon
相关产品推荐
相关产品推荐

