#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)
)
);
}
}