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

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(),
      },
    );
  }
}

关键修改说明

  1. 改用await处理异步:把then回调换成await,确保我们在获取到agree的真实值之后再执行路由判断,这样逻辑才会正确触发。
  2. 移除无效的setState:直接删掉那个自定义的setState函数,它在main函数里没有任何作用。
  3. 安全的空值判断:用agree == null || agree.isEmpty同时判断null和空字符串的情况,避免出现运行时异常。

这样修改后,启动页就能根据SharedPreferences里的agree字段,正确跳转到对应的条款页面或首页了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 15:42:32