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

Flutter如何读取SharedPreferences的nome值传入其他类TextWidget

Flutter 读取SharedPreferences用户名并跨页面展示实现方案

你现有写入逻辑已经能正常存值,不需要大改,只需要补读取和传值逻辑即可。另外你现有写入代码里两次调用SharedPreferences.getInstance()属于冗余代码,这个类是全局单例,只需要获取一次实例就能完成所有键值的读写,不影响现有功能,可以顺手优化。

1. 封装公共读取方法

把读取本地存储的逻辑抽成公共方法,后续所有页面需要读值都可以直接调用:

/// 读取本地存储的用户名
Future<String?> getStoredUserName() async {
  final SharedPreferences prefs = await SharedPreferences.getInstance();
  // 读取键为'nome'的字符串值,未存储时默认返回null
  return prefs.getString('nome');
}

2. 两种场景的实现方案

根据你的页面跳转逻辑选对应方案即可:

方案一:登录后直接跳转的页面,路由传参

适合登录成功后直接跳首页/用户中心的场景,读取到值之后直接通过路由构造函数传递给目标页面:

  • 登录成功后的跳转逻辑:
// 调用login方法校验通过后
bool loginSuccess = await login();
if (loginSuccess) {
  // 先读取存好的用户名
  final String userName = (await getStoredUserName()) ?? '用户';
  // 跳转时传入目标页面
  Navigator.pushReplacement(
    context,
    MaterialPageRoute(
      builder: (context) => HomePage(nome: userName),
    ),
  );
}
  • 目标页面(接收参数并在Text中展示):
class HomePage extends StatelessWidget {
  final String nome;
  // 构造函数接收传入的用户名
  const HomePage({super.key, required this.nome});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        children: [
          // 直接在Text组件中使用传入的值
          Text('欢迎回来,$nome', style: TextStyle(fontSize: 18)),
          // 其他页面组件
        ],
      ),
    );
  }
}

方案二:跨多页面使用,组件内自行读取

如果用户名需要在多个不直接关联的页面展示,不需要层层传参,直接在需要展示的Text组件外包裹FutureBuilder处理异步读取逻辑即可:

class UserNameText extends StatelessWidget {
  const UserNameText({super.key});

  @override
  Widget build(BuildContext context) {
    return FutureBuilder<String?>(
      future: getStoredUserName(),
      builder: (context, snapshot) {
        // 读取过程中展示占位
        if (snapshot.connectionState == ConnectionState.waiting) {
          return Text('加载中...', style: TextStyle(fontSize: 16));
        }
        // 读取失败/无值时兜底
        final showName = snapshot.data ?? '游客';
        // 返回最终展示的文本组件
        return Text(
          showName,
          style: TextStyle(fontSize: 16, fontWeight: FontWeight.w500),
        );
      },
    );
  }
}

后续任意页面需要展示用户名,直接引入UserNameText()组件即可,不需要额外传参。

注意:实现退出登录逻辑时,记得调用prefs.remove('nome')、prefs.remove('token')清除对应键的存储值,避免多账号登录时数据残留。

内容的提问来源于stack exchange,提问作者Gabriel G Maiworm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 09:36:25