Удаление OverlayEntry на кнопке «Назад» в Flutter

#flutter #flutter-layout

#трепетание #флаттер-макет

Вопрос:

Я использую OverlayEntry и хочу, чтобы запись удалялась при обратном нажатии.

 OverlayEntry overlayEntry;
    overlayEntry = OverlayEntry(builder: (c) {
      return FullScreenLoader(
          loaderText: "Placing Order",
          );
    },maintainState: true);
    Overlay.of(context).insert(overlayEntry);
 

и внутри Build метода FullScreenLoader, который я использовал onWillScope , но все равно он не работает.

  @override
  Widget build(BuildContext context) {
    return new WillPopScope(
        onWillPop: _onWillPop,
    );
  }

Future<bool> _onWillPop() {
    return "" ?? false;
}
 

Я просто хочу обнаружить физическую кнопку обратного нажатия, чтобы я мог удалить наложение при обратном нажатии.

Я что-то упустил? Или это невозможно с наложением?

Комментарии:

1. Вы нашли решение?

2. Пока нет. Я буду обновлять здесь, если таковые имеются

3. Решение Адриана работает лучше всего

4. Вы должны создать компонент с отслеживанием состояния, а затем вызвать OverlayEntry.remove(); в методе Dispose()

Ответ №1:

То, как вы пытаетесь это сделать, должно сработать. Используйте WillPopScope для обнаружения обратного нажатия и удаления наложения, если оно видно.

Вот рабочий пример кода. Сохраните глобальную ссылку на запись overlay и добавьте WillPopScope в метод build класса state:

 class _XYZState extends State<XYZ> {
  OverlayEntry _detailsOverlayEntry;

  @override
  Widget build(BuildContext context) {
    return Container(
      child: WillPopScope(
        onWillPop: _onWillPop,
        child: GoogleMap(
          mapType: MapType.normal,
          initialCameraPosition: _kFallbackInitialCameraPosition,
          polylines: _polylines.toSet(),
          myLocationEnabled: false,
          myLocationButtonEnabled: false,
          onMapCreated: (GoogleMapController controller) {
            _controller.complete(controller);
          },
        ),
      ),
    );
  }

  Future<bool> _onWillPop() {
    if(_detailsOverlayEntry != null){
      _detailsOverlayEntry.remove();
      _detailsOverlayEntry = null;
      return Future.value(false);
    }
    return Future.value(true);
  }
}
 

Как вы можете видеть, _detailsOverlayEntry == null проверка условий используется для проверки того, видна ли запись overlay. В случае, если он виден, удалите его и установите для ссылки значение null.

При следующем нажатии кнопки «Назад» появится маршрут.

Ответ №2:

Я знаю, что этот пост старше. Но у меня была похожая проблема. В моем случае я не хотел, чтобы отображалась базовая страница, а только наложение. Я добился этого, используя BackButtonListener.

 class DismissibleOverlay extends StatelessWidget {
  final Widget child;
  final OverlayEntry overlayEntry;
  const DismissibleOverlay({Key? key, required this.child, required this.overlayEntry}) : super(key: key);



  @override
  Widget build(BuildContext context) {
    return BackButtonListener(
        onBackButtonPressed: () async { overlayEntry.remove(); return Future.value(true);},
        child: Dismissible(
            onDismissed: (dismissDirection) => overlayEntry.remove(),
            direction: DismissDirection.vertical,
            key: Key(''),
            child: ColorfulSafeArea(child: child)
        )
    );

  }
}