Flutter启动页(SplashScreen)中如何实现条件判断跳转?
问题分析与修复方案
你的代码里有几个关键问题导致跳转逻辑失效,我来逐一拆解并给出修复方案:
核心问题点
- 异步执行顺序错误:你用
then来获取SharedPreferences的值,但then是异步回调,后面的路由判断会在agree被赋值前就执行,此时agree还是初始的null,逻辑完全不生效。 - 无用的自定义
setState:main函数没有Widget的状态上下文,这个自定义的setState根本起不到任何作用,完全是多余的。 - 空值判断风险:直接调用
agree.isEmpty会在agree为null时抛出异常,因为null没有isEmpty方法,必须先做null判断。
修复后的完整代码
import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:newbharatbiz/Screens/HomePage.dart'; import 'package:newbharatbiz/Screens/TermsAndCondition.dart'; import 'package:newbharatbiz/Utils/MySharedPreferences.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); String initialRoute; // 用await等待异步操作完成,确保拿到agree的值后再判断 final agree = await MySharedPreferences.instance.getStringValue("agree"); // 安全判断:覆盖null和空字符串两种情况 if (agree == null || agree.isEmpty) { initialRoute = 'TermsAndCondition'; } else { initialRoute = 'home'; } runApp(MyApp(initialRoute: initialRoute)); } class MyApp extends StatelessWidget { final String initialRoute; MyApp({required this.initialRoute}); @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData( primarySwatch: Colors.blue, ), initialRoute: initialRoute, routes: { 'TermsAndCondition': (context) => TermsAndCondition(), 'home': (context) => HomePage(), }, ); } }
关键修改说明
- 改用
await处理异步:把then回调换成await,确保我们在获取到agree的真实值之后再执行路由判断,这样逻辑才会正确触发。 - 移除无效的
setState:直接删掉那个自定义的setState函数,它在main函数里没有任何作用。 - 安全的空值判断:用
agree == null || agree.isEmpty同时判断null和空字符串的情况,避免出现运行时异常。
这样修改后,启动页就能根据SharedPreferences里的agree字段,正确跳转到对应的条款页面或首页了。
内容的提问来源于stack exchange,提问作者Debendra
相关产品推荐
相关产品推荐

