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

Flutter中使用Navigator.pop传递User对象时类型不匹配报错求助

Flutter Navigator.pop传递User对象时出现TypeError: 'User' is not a subtype of type 'bool?'

问题详情

尝试通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 18:54:23