Flutter中使用Navigator.pop传递User对象时类型不匹配报错求助
问题详情
尝试通过Navigator.pop(context, result)关闭页面时传递User对象,触发点击手势后抛出类型不匹配错误:
======== 手势处理捕获到异常 =============================================================== 处理手势时抛出以下_TypeError: type 'User' is not a subtype of type 'bool?' of 'result' 异常抛出时的调用栈: #0 LocalHistoryRoute.didPop (package:flutter/src/widgets/routes.dart) #1 _RouteEntry.handlePop (package:flutter/src/widgets/navigator.dart:2896:16) #2 NavigatorState._flushHistoryUpdates (package:flutter/src/widgets/navigator.dart:3868:22) #3 NavigatorState.pop (package:flutter/src/widgets/navigator.dart:4910:7) #4 Navigator.pop (package:flutter/src/widgets/navigator.dart:2432:27) #5 _DistributeurListState.build.. (package:electrosteel_project/widget/point_de_vente/distributeur_list.dart:312:39) #6 _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:1005:21) #7 GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:198:24) #8 TapGestureRecognizer.handleTapUp (package:flutter/src/gestures/tap.dart:613:11) #9 BaseTapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:298:5) #10 BaseTapGestureRecognizer.acceptGesture (package:flutter/src/gestures/tap.dart:269:7) #11 GestureArenaManager.sweep (package:flutter/src/gestures/arena.dart:157:27) #12 GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:449:20) #13 GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:425:22) #14 RendererBinding.dispatchEvent (package:flutter/src/rendering/binding.dart:329:11) #15 GestureBinding._handlePointerEventImmediately (package:flutter/src/gestures/binding.dart:380:7) #16 GestureBinding.handlePointerEvent (package:flutter/src/gestures/binding.dart:344:5) #17 GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:302:7) #18 GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:285:7) #22 _invoke1 (dart:ui/hooks.dart:170:10) #23 PlatformDispatcher._dispatchPointerDataPacket (dart:ui/platform_dispatcher.dart:331:7) #24 _dispatchPointerDataPacket (dart:ui/hooks.dart:94:31) (省略了dart:async中的3个帧) Handler: "onTap" Recognizer: TapGestureRecognizer#b4118 debugOwner: GestureDetector state: ready won arena finalPosition: Offset(150.9, 333.7) finalLocalPosition: Offset(150.9, 93.0) button: 1 sent tap down
触发错误的代码片段:
onTap: () { Navigator.pop(context,userList[index]); },
解决方案
错误核心是当前页面的路由期望接收bool?类型的返回值,但你传递了User对象,针对不同场景有以下解决方式:
1. 调整返回值接收类型(如果原本需要接收User)
检查打开当前页面的代码,比如Navigator.push的调用处,是否错误声明了接收bool类型:
- 错误写法:
final bool? result = await Navigator.push( context, MaterialPageRoute(builder: (context) => YourPage()), ); - 修正为:
final User? result = await Navigator.push( context, MaterialPageRoute(builder: (context) => YourPage()), );
2. 包装返回值(如果路由确实需要返回bool)
如果当前页面的路由必须返回bool(比如弹窗类组件默认逻辑),可以用自定义类或Map同时传递bool和User:
方式1:自定义类包装
// 定义返回结果类 class PopResult { final bool isConfirmed; final User user; PopResult(this.isConfirmed, this.user); } // 弹出时传递 onTap: () { Navigator.pop(context, PopResult(true, userList[index])); } // 接收时处理 final PopResult? result = await Navigator.push(...); if (result != null) { bool confirmed = result.isConfirmed; User selectedUser = result.user; // 后续逻辑 }
方式2:用Map临时包装
// 弹出时传递 onTap: () { Navigator.pop(context, { 'isConfirmed': true, 'user': userList[index] }); } // 接收时处理 final Map? result = await Navigator.push(...); if (result != null) { bool confirmed = result['isConfirmed'] as bool; User selectedUser = result['user'] as User; // 后续逻辑 }
3. 确认路由类型
如果当前页面是通过showDialog、showModalBottomSheet这类默认期望返回bool的方法打开的,建议改用MaterialPageRoute等普通页面路由,这样可以自由定义返回值类型,避免类型约束冲突。
内容的提问来源于stack exchange,提问作者Brahim CHEBBI
相关产品推荐
相关产品推荐

