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

Flutter按钮onPressed调用setData时Navigator.push跳转报错

问题根因

你代码报错来自4个核心问题:

  • onPressed回调语法完全错误:onPressed: setData { ... }是非法Dart语法,编译器无法解析这个回调结构,属于编译阶段就会触发的错误。
  • 未处理Firebase异步逻辑:set()是异步网络请求方法,没有等待请求完成就执行跳转,极易出现上下文销毁、请求中断的运行时错误。
  • 组件属性缺失:你贴的MaterialButton代码没有配置必填的child属性,运行时会直接抛出组件属性缺失的异常。
  • 路由逻辑不符合需求:Navigator.push是在当前路由栈顶新增页面,用户点击返回键会回到当前提交页,不符合“跳转回首页”的常规交互预期。
修复代码

1. 修正按钮组件实现

final sdButton = Material( 
  elevation: 5,
  borderRadius: BorderRadius.circular(5),  
  color: const Color(0xFFD3DEDC),  
  child: MaterialButton(   
    padding: const EdgeInsets.fromLTRB(20,15,20,15),
    minWidth: MediaQuery.of(context).size.width, 
    // 用标准匿名函数作为回调,添加async关键字处理异步逻辑
    onPressed: () async {
      try {
        // 等待数据上传完成
        await setData();
        // 校验context有效性,防止异步完成后页面已销毁触发异常
        if (!context.mounted) return;
        // 替换当前路由为首页,避免返回键回到提交页
        Navigator.pushReplacement(
          context, 
          MaterialPageRoute(builder: (context) => const Homepage()),
        );
      } catch (e) {
        // 上传失败可在这里添加错误提示,比如弹出SnackBar告知用户提交失败
      }
    },
    // 补全必填的child属性,替换成你实际需要的按钮文案/组件
    child: const Text(
      "提交并返回首页",
      style: TextStyle(fontSize: 16),
    ),
  ),
);

2. 修正setData异步方法

// 将方法标记为异步返回Future,支持外部等待执行结果
Future<void> setData() async {
  await dref.child(user!.uid).set({
    'user_id' : user!.uid,
    'intime' : '15.17'
  });
}
额外优化建议

如果你要跳转的首页已经在路由栈最底部,不需要重新创建首页实例,可以把跳转代码替换为下面的写法,直接清空当前所有上方路由回到首页,交互更流畅:

Navigator.popUntil(context, (route) => route.isFirst);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 02:54:40