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

求助: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 18:57:43