Вместо того, чтобы дать вам прямой ответ, я расскажу вам, как я думал об этом, когда увидел вопрос, в надежде, что это поможет вам в будущем.
Давайтевзгляните на утверждение.Это говорит Failed assertion: line 1995 pos 12: '!_debugLocked': I/flutter (24830): is not true.
.Хм, интересно.Давайте посмотрим на эту строку кода.
assert(!_debugLocked);
Ну, это не дает мне больше информации, давайте посмотрим на переменную.
bool _debugLocked = false; // used to prevent re-entrant calls to push, pop, and friends
Это лучше.Он предназначен для предотвращения повторных входящих вызовов push, pop и т. Д. (Это означает, что он не хочет, чтобы вы вызывали «push», «pop» и т. Д. Из вызова «push», «pop»).Итак, давайте проследим это до вашего кода.
Это похоже на вероятного виновника:
bottomSheet.closed.then((v) {
Navigator.of(context)
.popUntil((r) => r.settings.isInitialRoute);
});
Я собираюсь пропустить здесь шаг и использовать вместо этого дедуктивное рассуждение - я держу паричто закрытое будущее закончено в течение pop
.Если хотите, подтвердите, прочитав код.
Итак, если проблема в том, что мы вызываем pop из функции pop, нам нужно найти способ отложить вызоввсплывать до тех пор, пока поп не завершится.
Это становится довольно простым - есть два способа сделать это.Простой способ состоит в том, чтобы просто использовать отложенное будущее с нулевой задержкой, при котором дарт будет планировать вызов как можно скорее, как только текущий стек вызовов вернется в цикл обработки событий:
Future.delayed(Duration.zero, () {
Navigator. ...
});
Другой более трепетныйy способ сделать это - использовать планировщик для планирования вызова после завершения текущего цикла сборки / рендеринга:
SchedulerBinding.instance.addPostFrameCallback((_) {
Navigator. ...
});
Любой из этих способов должен устранить проблему, с которой вы столкнулись.
Однако возможен и другой вариант - в вашей ExtendedFloatingActionButton, где вы вызываете pop:
ExtendedFloatingActionButton(
text: "ORDER DETAILS",
action: () {
Navigator.of(context).pop();
},
),
, вы могли бы вместо этого просто сделать вызов Navigator.of(context).popUntil...
.Это избавит от необходимости делать что-либо после вызова bottomSheet.closed.Однако, в зависимости от того, что еще вам может или не нужно делать в своей логике, это может быть не идеальным (я определенно вижу проблему с тем, что на нижнем листе показано изменение основной части страницы, и почему выпытался сделать это в логике страницы).
Кроме того, когда вы пишете свой код, я бы сильно рекомендовал разделить его на виджеты - например, нижний лист должен быть егособственный виджет.Чем больше у вас функций построения, тем сложнее им следовать, и это может фактически повлиять на производительность.Вы также должны избегать использования экземпляров GlobalKey везде, где это возможно - вы можете либо пропустить объекты (или обратные вызовы) вниз, если это только через несколько слоев, использовать шаблон .of (context) или использовать унаследованные виджеты.