Flutter如何在其他页面读取SharedPreferences存储的登录用户数据
解决方案
步骤1:提前初始化SPUtil
你封装的SPUtil需要先完成初始化才能正常读写数据,建议在应用启动时就完成初始化,修改main.dart的启动逻辑:
void main() async { // 确保Flutter框架初始化完成 WidgetsFlutterBinding.ensureInitialized(); // 初始化SPUtil await SPUtil.getInstance(); runApp(const MyApp()); }
步骤2:在HomePage中取出并解析用户数据
你存入的是User对象序列化后的JSON字符串,取出时反向解析为User对象即可直接使用id、邮箱、用户名等字段,示例代码如下:
import 'dart:convert'; import 'package:flutter/material.dart'; // 导入你自己的SPUtil和User实体类 import 'sputils.dart'; import 'user.dart'; class HomePage extends StatefulWidget { const HomePage({super.key}); @override State<HomePage> createState() => _HomePageState(); } class _HomePageState extends State<HomePage> { User? _currentUser; @override void initState() { super.initState(); _loadUserInfo(); } void _loadUserInfo() { // 取出本地存储的用户JSON字符串 String userStr = SPUtil.getString('user'); if (userStr.isNotEmpty) { // 解析为User对象 Map<String, dynamic> userMap = jsonDecode(userStr); setState(() { _currentUser = User.fromJson(userMap); }); } else { // 未取到用户信息说明未登录,可自行处理跳转到登录页的逻辑 } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text("首页")), body: _currentUser == null ? const Center(child: Text("请先登录")) : Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ Text("用户ID:${_currentUser?.id}"), Text("用户名:${_currentUser?.username}"), Text("邮箱:${_currentUser?.email}"), ], ), ); } }
优化建议
- 如果多个页面都需要用到用户信息,建议把用户信息抽为全局状态管理(Provider、Riverpod、Bloc均可),避免每个页面重复写读取解析的逻辑
- 用户退出登录时调用
SPUtil.clearString('user')即可清除本地存储的用户数据
内容的提问来源于stack exchange,提问作者Olaniyan Adewale
相关产品推荐
相关产品推荐

