如何使用shared_preferences正确保存Flutter应用的登录数据
问题根因
MaterialApp同时配置了home和initialRoute参数,initialRoute优先级更高,会直接覆盖你基于_loginData判断的首页逻辑,所以每次启动都会强制跳转到身份验证页面- 保存登录数据时没有加
await等待异步写入操作完成,极端场景下会出现写入未完成就跳转页面或者杀进程,导致数据没有实际持久化到本地 - 补充优化提示:不要将明文密码这类敏感信息存储在
shared_preferences中,如后续需要存储登录凭据,建议使用加密存储类库
修复方案
1. 修改main.dart代码
移除initialRoute参数,让home的登录状态判断逻辑生效,修改后代码如下:
void main() async { WidgetsFlutterBinding.ensureInitialized(); SharedPreferences preferences = await SharedPreferences.getInstance(); final _loginData = preferences.getString('loginData'); runApp( MaterialApp( home: _loginData == null ? AuthWidget() : MainScreenWidget(), routes: { '/auth': (context) => AuthWidget(), '/main_screen': (context) => MainScreenWidget(), '/evroko_standart_screen': (context) => EvrokoStandartScreen(), '/evroko_vip_screen': (context) => EvrokoVipScreen(), '/oskanova_screen': (context) => OskanovaScreen(), '/oskanova_premium_screen': (context) => OskanovaPremiumScreen(), '/message_screen': (context) => Message_screen(), '/map_screen': (context) => MapScreen(), '/reservation_screen': (context) => Reservation_screen(), }, ), ); }
2. 修改登录页写入数据逻辑
给setString操作加上await,确保数据写入完成后再跳转页面:
// 原代码替换为这行 await preferences.setString('loginData', userName!);
可选排查方案
如果修改后仍存在问题,可以在main方法中打印_loginData的值,确认重启应用后是否能正常读取到之前写入的内容,排除写入失败的异常。另外退出登录时需要主动调用preferences.remove('loginData')清空存储的登录标识,避免登出后仍直接进入主页。
内容的提问来源于stack exchange,提问作者Чак Джонс
相关产品推荐
相关产品推荐

