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

Flutter Upgrader强制升级路由与启动屏冲突问题求助

解决方案

核心思路

放弃使用initialRoute,将MaterialApp的home设置为一个初始化页面,在该页面内完成升级状态检查:需要升级时直接显示UpgradeAlert并阻止启动屏流程;无需升级时再触发启动屏并跳转至主页面。


步骤1:配置全局NavigatorKey与Upgrader

先定义全局导航键,确保Upgrader和自定义路由逻辑能共享导航上下文:

final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();

final upgrader = Upgrader(
  navigatorKey: navigatorKey,
  allowSkip: false, // 强制升级,禁止跳过
  allowLater: false, // 禁止稍后提醒
  durationUntilAlertAgain: const Duration(days: 0), // 立即触发升级检查
);

步骤2:实现初始化页面逻辑

创建一个初始化页面作为MaterialApp的入口,在initState中完成升级检查,根据结果分支处理:

class InitPage extends StatefulWidget {
  const InitPage({super.key});

  @override
  State<InitPage> createState() => _InitPageState();
}

class _InitPageState extends State<InitPage> {
  @override
  void initState() {
    super.initState();
    _checkUpgradeStatus();
  }

  Future<void> _checkUpgradeStatus() async {
    // 等待Upgrader完成版本校验,返回是否需要升级
    final needUpgrade = await upgrader.checkVersion();
    
    if (!needUpgrade) {
      // 无需升级,执行启动屏定时器后跳转主页面
      await Future.delayed(const Duration(seconds: 3));
      if (mounted) {
        navigatorKey.currentState?.pushReplacementNamed('/home');
      }
    }
    // 需要升级时,Upgrader会自动弹出UpgradeAlert,无需额外操作
  }

  @override
  Widget build(BuildContext context) {
    return UpgradeAlert(
      upgrader: upgrader,
      child: const SplashScreen(), // 启动屏仅在无需升级时显示
    );
  }
}

// 启动屏组件
class SplashScreen extends StatelessWidget {
  const SplashScreen({super.key});

  @override
  Widget build(BuildContext context) {
    return const Scaffold(
      body: Center(child: Text('启动屏加载中...')),
    );
  }
}

步骤3:配置MaterialApp

将初始化页面设为home,并定义主页面路由:

MaterialApp(
  navigatorKey: navigatorKey,
  home: const InitPage(),
  routes: {
    '/home': (context) => const HomePage(), // 你的主页面
  },
);

问题针对性说明

  1. 解决启动屏与UpgradeAlert冲突:通过初始化页面的分支逻辑,仅在无需升级时才显示启动屏并执行跳转,避免了pushReplacementNamed移除UpgradeAlert的问题。
  2. 无需手动获取商店版本:Upgrader的checkVersion()方法会自动查询App Store/Google Play的版本并返回是否需要升级,无需手动处理版本对比。
  3. 解决willDisplay返回null与路由跳转:使用checkVersion()等待升级检查完成(返回明确的bool值),通过全局navigatorKey统一控制路由跳转,避免上下文获取问题。

调试注意事项

测试时可开启Upgrader的测试模式,模拟版本差异:

upgrader.testing = true;
upgrader.testVersion = '2.0.0'; // 模拟商店版本高于当前版本

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 13:35:11