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
相关产品推荐
相关产品推荐

