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
相关产品推荐
相关产品推荐

