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

如何使用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,提问作者Чак Джонс

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 16:15:03