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

Flutter启动页条件判断中已打印为null的变量为何被识别为非null

问题错误原因&修复方案

核心错误点

  • initState方法覆盖错误
    你定义的String initState()不符合Flutter State生命周期方法签名,父类initState是无返回值的void方法,签名不匹配会导致你写的initState不会被系统自动调用,逻辑无法正常执行。如果你的print语句实际有输出,说明你是贴代码时手误写错了返回值,正确签名应为@override void initState()。
  • 异步操作未等待完成
    SQLite查询方法fetchValues()是异步IO操作,返回Future类型,你没有加await等待查询执行完成就直接读取values_list_r赋值给变量a,此时values_list_r还未被查询结果赋值,要么是初始null,要么是空默认值。同时你调用fetchValues()时没有接收返回值,如果你是在方法内部给全局变量values_list_r赋值,也必须等待异步执行完成后再读取。
  • 条件判断逻辑错误
    你当前的跳转判断条件为a != null,但即便查询到的用户列表为空,执行map.toList()后得到的是空列表[],空列表不属于null,会被判定为条件成立,直接跳转到introduce页面。你需要同时判断变量是否为null、是否为空。
  • SplashScreen跳转逻辑缓存问题
    你用的SplashScreen组件的navigateAfterSeconds属性是在组件首次build时就确定跳转目标的,即便后续通过setState更新了a的值,SplashScreen内部已经缓存了初始的跳转目标,不会跟随更新,导致判断一直使用a的初始值。

修复方案

第一步 调整异步逻辑与状态判断

class _MyAppState extends State<MyApp> {
  // 标记是否已登录,初始为null代表还在加载状态
  bool? _isLogin;

  @override
  void initState() {
    super.initState();
    _checkLoginStatus();
  }

  // 封装异步登录状态检查
  void _checkLoginStatus() async {
    ValuesDbprovider vdbhelper = ValuesDbprovider();
    // 等待异步查询完成,接收返回结果,不要用全局变量传值
    List valuesList = await vdbhelper.fetchValues();
    setState(() {
      // 同时判断列表不为null且不为空才标记为已登录
      _isLogin = valuesList?.isNotEmpty ?? false;
    });
    // 倒计时结束后手动跳转,不要依赖SplashScreen的navigateAfterSeconds
    Future.delayed(Duration(seconds: 3), () {
      Navigator.pushReplacement(
        context,
        MaterialPageRoute(builder: (context) => _isLogin == true ? introduce() : login())
      );
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Container(
        decoration: BoxDecoration(
          gradient: LinearGradient(
            begin: Alignment.centerLeft,
            end: Alignment.centerRight,
            colors: [Color(0xFFFF1844), Color(0xFFFFD200)]
          )
        ),
        child: SplashScreen(
          seconds: 3,
          // 移除navigateAfterSeconds属性,改为手动跳转
          loadingText: Text('calculator',
            textAlign: TextAlign.center,
            style: TextStyle(
              fontSize: 20, fontWeight: FontWeight.w900, fontFamily: 'yasamin',color: Colors.white,
            ),
          ),
          image: Image.asset('images/logo_logo.png'),
          styleTextUnderTheLoader: TextStyle(),
          photoSize: 100.0,
          onClick: ()=>print("wellcome"),
          loaderColor: Colors.white,
        ),
      ),
    );
  }
}

第二步 调整数据库查询方法

确保fetchValues()方法返回Future<List>类型,不要通过全局变量传递查询结果,避免异步逻辑混乱。


内容的提问来源于stack exchange,提问作者Hamed Zahiri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 21:09:03