Flutter Webview с GoRouter (навигация 2.0) — как обрабатывать нажатие кнопки «Назад»

Согласно этого блога, при использовании Navigator 2.0 и/или (в моем случае) GoRouter вы больше не можете переопределять кнопку возврата телефона с помощью вызова функции «WillPopScope» и onWillPop. Navigator 2.0 теперь использует PopRoute для возврата.

Это вызывает проблему при использовании веб-просмотра на флаттер-странице. Если пользователь переходит на другую веб-страницу в этом веб-представлении, а затем нажимает кнопку «Назад» на своем телефоне, он, естественно, ожидает, что веб-представление вернется к предыдущей веб-странице. Но вместо этого он уводит пользователя с этой страницы и возвращает на предыдущую страницу флаттера.

Есть ли способ обойти это? Могу ли я, чтобы моя кнопка «Назад» сначала проверила, есть ли контроллер.canGoBack(), как я раньше мог делать со старой системой Navigator?

Запуск PHP на IIS без использования программы установки веб-платформы
Запуск PHP на IIS без использования программы установки веб-платформы
Установщик веб-платформы, предлагаемый компанией Microsoft, перестанет работать 31 декабря 2022 года. Его закрытие привело к тому, что мы не можем...
Оптимизация React Context шаг за шагом в 4 примерах
Оптимизация React Context шаг за шагом в 4 примерах
При использовании компонентов React в сочетании с Context вы можете оптимизировать рендеринг, обернув ваш компонент React в React.memo сразу после...
Библиотека для работы с мороженым
Библиотека для работы с мороженым
Лично я попрощался с операторами print() в python. Без шуток.
Настройка шаблона Metronic с помощью Webpack и Gulp
Настройка шаблона Metronic с помощью Webpack и Gulp
Я пишу эту статью, чтобы поделиться тем, как настроить макет Metronic с помощью Sass, поскольку Metronic предоставляет так много документации, и они...
Уроки CSS 6
Уроки CSS 6
Здравствуйте дорогие читатели, я Ферди Сефа Дюзгюн, сегодня мы продолжим с вами уроки css. Сегодня мы снова продолжим с так называемых классов.
Что такое Css? Для чего он используется?
Что такое Css? Для чего он используется?
CSS, или "Каскадные таблицы стилей", - это язык стилей, используемый в веб-страницах. CSS является одним из основных инструментов веб-разработки...
3
0
152
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я нашел решение. Замысловато, но функционально:

Мне пришлось создать собственный «backButtonDispatcher» и добавить его в функцию main.dart MaterialApp.router.

child: Builder(builder: (BuildContext context) {
    final router = Provider.of<MainRouter>(context, listen: false).router;
    backbuttondispatcher = backButtonDispatcher(router.routerDelegate, settings);

    return MaterialApp.router(
      routeInformationParser: router.routeInformationParser,
      routeInformationProvider: router.routeInformationProvider,
      routerDelegate: router.routerDelegate, 
      backButtonDispatcher: backbuttondispatcher,
      .
      .
      .

Я создал новый диспетчер в папке маршрутизатора и назвал его «backbuttondispatcher.dart.

import 'package:flutter/material.dart';

class backButtonDispatcher extends RootBackButtonDispatcher {

     final RouterDelegate _routerDelegate;
     final _settings;

backButtonDispatcher(this._routerDelegate,this._settings)
  : super();

Future<bool> didPopRoute() async {
  //Can user leave the page?
  if (!_settings.canLeavePage) {
    //no, as the webview widget has flagged canLeavePage as false
    _settings.goBackToPreviousWebsite();
    return true;
  }else{
    //yes, perform standard popRoute call
    return _routerDelegate.popRoute();
  }
 }
}

Используя ссылку на общий класс (я использовал «_settings»), я сохраняю флаг, который говорит, прошел ли пользователь более одной веб-страницы — если TRUE, диспетчер кнопки «Назад» не вернется к предыдущему маршруту/странице. и вместо этого вызовите другую функцию (указатель), которая обрабатывает возврат к предыдущей веб-странице в маршруте виджета веб-просмотра. Но если FALSE, диспетчер выполняет стандартную функцию didPopRoute.

Кроме того, на всех других маршрутах/страницах с веб-просмотром функция указателя и логическое значение должны сбрасываться на нуль и ложь. Это не идеально, но, к счастью, в приложении не так много страниц.

Меня раздражает, что они изменили функциональность кнопки «Назад» для навигации по основному маршруту/странице, но не приняли во внимание тот факт, что кнопку «Назад» также можно использовать для возврата на предыдущую веб-страницу. Я понимаю, что нам в любом случае не следует показывать веб-страницы с приложениями, но мы, простые разработчики, не всегда имеем возможность отклонить требования приложений сверху.

Другие вопросы по теме