Flutter实现登录状态判断跳转异常:仅显示白屏无报错
Flutter实现登录状态判断跳转异常:仅显示白屏无报错
看起来你遇到的问题挺典型的——代码逻辑看起来没问题,但运行后就是白屏,还没报错。我帮你梳理下可能的原因和修复方案:
首先排查最容易忽略的点:目标页面是否有内容?
你代码里的Home和LoginDemo组件,如果只是空的Scaffold甚至连Scaffold都没写,那自然会显示白屏!先确认这两个组件的实现,比如给它们加上基础的UI:
// 示例Home组件 class Home extends StatelessWidget { const Home({super.key}); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text('主页')), body: const Center(child: Text('欢迎回来!')), ); } } // 示例LoginDemo组件 class LoginDemo extends StatelessWidget { const LoginDemo({super.key}); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text('登录')), body: const Center(child: Text('请登录账号')), ); } }
优化异步状态处理,避免空白等待
你当前在main函数里直接用await获取SharedPreferences,虽然逻辑没问题,但如果初始化耗时较长,用户会看到一段时间的白屏。推荐用FutureBuilder在Widget树里处理异步逻辑,同时显示加载状态:
void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( debugShowCheckedModeBanner: false, home: FutureBuilder<bool>( future: _checkLoginStatus(), builder: (context, snapshot) { // 异步操作未完成时显示加载圈,避免白屏 if (snapshot.connectionState == ConnectionState.waiting) { return const Scaffold( body: Center(child: CircularProgressIndicator()), ); } // 拿到登录状态后跳转对应页面 final isLoggedIn = snapshot.data ?? false; return isLoggedIn ? const Home() : const LoginDemo(); }, ), routes: { '/home': (context) => const Home(), '/sign_up': (context) => const SignUp(), }, ); } // 封装登录状态检查逻辑,更清晰 Future<bool> _checkLoginStatus() async { final prefs = await SharedPreferences.getInstance(); // 打印状态到控制台,确认取值是否正确 final isLoggedIn = prefs.getBool('isLoggedIn') ?? false; print('当前登录状态:$isLoggedIn'); return isLoggedIn; } }
调试确认SharedPreferences的取值
加个打印语句(上面代码里已经加了),看看控制台输出的isLoggedIn值是否符合你的预期——比如你之前有没有正确设置过这个键值对?如果从来没存过,默认是false,应该跳转到登录页;如果存过true,应该跳主页。
按照上面的步骤排查,应该就能解决白屏的问题啦!
备注:内容来源于stack exchange,提问作者Sreejith Sree
相关产品推荐
相关产品推荐

