======== Exception caught by gesture ===============================================================
The following assertion was thrown while handling a gesture:
'package:flutter/src/widgets/navigator.dart': Failed assertion: line 4429 pos 12: '!_debugLocked': is not true.
Either the assertion indicates an error in the framework itself, or we should provide substantially more information in this error message to help you determine and fix the underlying cause.
In either case, please report this assertion by filing a bug on GitHub:
https://github.com/flutter/flutter/issues/new?template=2_bug.md
When the exception was thrown, this was the stack:
#2 NavigatorState._pushEntry (package:flutter/src/widgets/navigator.dart:4429:12)
#3 NavigatorState.push (package:flutter/src/widgets/navigator.dart:4366:5)
#4 _MainPageState.build.<anonymous closure>.<anonymous closure> (package:organization_travel_app/mainpage.dart:118:61)
#5 _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:989:21)
#6 GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:198:24)
#7 TapGestureRecognizer.handleTapUp (package:flutter/src/gestures/tap.dart:608:11)
#8 BaseTapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:296:5)
#9 BaseTapGestureRecognizer.acceptGesture (package:flutter/src/gestures/tap.dart:267:7)
#10 GestureArenaManager.sweep (package:flutter/src/gestures/arena.dart:157:27)
#11 GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:443:20)
#12 GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:419:22)
#13 RendererBinding.dispatchEvent (package:flutter/src/rendering/binding.dart:322:11)
#14 GestureBinding._handlePointerEventImmediately (package:flutter/src/gestures/binding.dart:374:7)
#15 GestureBinding.handlePointerEvent (package:flutter/src/gestures/binding.dart:338:5)
#16 GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:296:7)
#17 GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:279:7)
#21 _invoke1 (dart:ui/hooks.dart:170:10)
#22 PlatformDispatcher._dispatchPointerDataPacket (dart:ui/platform_dispatcher.dart:331:7)
#23 _dispatchPointerDataPacket (dart:ui/hooks.dart:94:31)
(elided 5 frames from class _AssertionError and dart:async)
Handler: "onTap"
Recognizer: TapGestureRecognizer#2b9ed
debugOwner: GestureDetector
state: ready
won arena
finalPosition: Offset(65.1, 382.1)
finalLocalPosition: Offset(42.1, 32.1)
button: 1
sent tap down
==================================================================================
我不打算给你一个直接的答案,而是要带领你了解我看到这个问题时是如何思考的,希望对你今后的工作有所帮助。
让我们来看看这个断言。它说失败的断言:第1995行第12位置:'!_debugLocked'。I/flutter (24830): is not true.嗯,有意思。让我们看看这一行的代码。
assert(!_debugLocked);
嗯,这并没有给我更多的信息,让我们看看这个变量。
bool _debugLocked = false; // 用来防止对push、pop和friends的重入调用。
这就好了。它的存在是为了防止对push、pop等的重入调用(这意味着它不希望你在调用'push'、'pop'时调用'push'、'pop'等)。所以让我们追溯到你的代码。
这似乎是可能的罪魁祸首。
bottomSheet.closed.then((v) { Navigator.of(context) .popUntil((r) => r.settings.isInitialRoute);});
在这里我要跳过一个步骤,用演绎推理来代替--我打赌封闭的未来在弹出过程中已经完成。如果你愿意的话,可以通过阅读代码来确认这一点。
所以,如果问题是我们在一个pop函数中调用pop,我们需要想办法把对pop的调用推迟到pop完成之后。
这变得非常简单--有两种方法可以做到这一点。简单的方法是使用一个延迟为零的未来函数,一旦当前调用栈返回到事件循环,dart就会尽快安排调用。
Future.delayed(Duration.zero, () { Navigator. ...});
另一种更飘逸的方式是使用Scheduler来安排当前构建/渲染周期完成后的调用。
SchedulerBinding.instance.addPostFrameCallback((_) { Navigator. ...});
无论哪种方式都应该能消除你遇到的问题。
另一个选择也是可能的--在你的ExtendedFloatingActionButton中调用pop。
ExtendedFloatingActionButton( text: "ORDER DETAILS", action: () { Navigator.of(context).pop(); },),
你可以简单地调用Navigator.of(context).popUntil....。这样就不需要在调用bottomSheet.closed后做任何事情了。然而,根据你在逻辑中可能需要或不需要做的其他事情,这可能并不理想(我肯定能看到让底层表单引发页面主要部分变化的问题,以及你为什么试图在页面的逻辑中实现这一点)。
另外,当你写代码时,我强烈建议把它分成小部件--例如,底部页面应该是它自己的小部件。你在构建函数中的内容越多,就越难遵循,而且实际上也会对性能产生影响。你也应该尽可能避免使用GlobalKey实例--如果只是通过几层,你一般可以把对象(或回调)传递下去,使用.of(context)模式,或者使用继承的widget。