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

Flutter:initState中Navigator回调内语句不执行问题求助

问题原因
  1. then回调触发条件误解:Navigator.pushNamed返回的Future仅在**目标页面(HomeScreen)被pop回当前页面(SplashScreen)**时才会完成。启动页跳转至首页后,通常不会再返回启动页,因此then回调永远不会被触发,里面的WidgetsBinding.instance.allowFirstFrame()自然不会执行。
  2. 生命周期时序问题:在initState中直接调用Navigator操作时,Widget尚未完成挂载,此时执行异步跳转逻辑,容易出现上下文或回调失效的问题。
解决方案

方案1:调整逻辑,移除不必要的then回调

如果你的需求是完成用户状态检查后允许第一帧绘制并跳转,直接在跳转前/跳转同步逻辑中执行allowFirstFrame()即可,无需依赖页面返回的回调:

Future<void> checkUserStatus(context) async {
  final successOrFailure = await checkUserStatusUseCase(NoParams());
  if (successOrFailure is SuccessResult<bool>) {
    emit(state.copyWith(isUserExits: successOrFailure.data));
    logDebug('called');
    
    // 直接执行allowFirstFrame,无需等待页面返回
    WidgetsBinding.instance.allowFirstFrame();
    Navigator.pushNamed(context, HomeScreen.route);
    
    logDebug('called 2');
  }
}

方案2:修正initState中的调用时序

在initState中调用异步业务逻辑时,建议用addPostFrameCallback包裹,确保Widget完成挂载后再执行,避免生命周期异常:

class _SplashScreenState extends State<SplashScreen> {
  @override
  void initState() {
    super.initState(); // 规范:先调用super.initState
    WidgetsBinding.instance.addPostFrameCallback((_) {
      context.read<SplashViewModelCubit>().checkUserStatus(context);
    });
  }
}

方案3:若需等待目标页面渲染完成后执行

如果必须在HomeScreen渲染完成后执行allowFirstFrame(),可将逻辑移至HomeScreen的initState中:

class _HomeScreenState extends State<HomeScreen> {
  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addPostFrameCallback((_) {
      WidgetsBinding.instance.allowFirstFrame();
    });
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 04:22:22