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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 07:58:12