#flutter #flutter-layout
#flutter #flutter-макет
Вопрос:
У меня есть modalBottomSheet, ожидающий Future с индикатором прогресса. Я хочу сделать так, чтобы у пользователя не было возможности закрыть эту панель, нажав на темную область над панелью, проведя по панели вниз и (это, вероятно, сложнее, но все же) с помощью кнопки «Назад» на Android. Мне нужно показать пользователю ответ из будущего. И я не могу, насколько я понимаю, изменить свойства enableDrag и isDismissible, поскольку этот showModalBottomSheet является методом
Единственное решение, которое я вижу, — это полноэкранный контейнер, но лист вызывается с новым маршрутом.
Есть ли решение, как это сделать?
Мой неработающий обходной путь (который я оборачиваю домашним виджетом):
class GestureOverlay extends StatelessWidget {
final Widget child;
const GestureOverlay({Key key, @required this.child}) : super(key: key);
@override
Widget build(BuildContext context) {
return Stack(
children: [child, GestureOverlayContainer()],
);
}
}
class GestureOverlayContainer extends StatefulWidget {
@override
_GestureOverlayContainerState createState() =>
_GestureOverlayContainerState();
}
class _GestureOverlayContainerState extends State<GestureOverlayContainer> {
StreamSubscription subscription;
bool gesture = true;
@override
void initState() {
subscription = appBloc.gestureOverlay
.listen((event) => setState(() => gesture = event));
super.initState();
}
@override
void dispose() {
subscription.cancel();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Container(
width: double.infinity,
height: gesture ? 0 : double.infinity,
color: Colors.red,
);
}
}
Комментарии:
1. Вы используете эту библиотеку? pub.dev/packages/modal_bottom_sheet Существует множество параметров, позволяющих избежать отклонения pub.dev/documentation/modal_bottom_sheet/latest (недопустимо)
Ответ №1:
Я думаю, что вы хотите реализовать здесь действие pop.
В Scaffold вызывается функция onWillPop
, которая будет перехватывать всплывающее действие, и вы можете решить, что делать при появлении. Например, ничего не делайте и просто не позволяйте ему выскакивать.
Future<bool> _willPopCallback() async {
// await showDialog or Show add banners or whatever
// then
return true; // return true if the route to be popped
}
//then pass the callback to WillPopScope
new WillPopScope(child: new Scaffold(), onWillPop: _willPopCallback)
Комментарии:
1. О, это именно то, что я ищу. Я сразу подумал о перехвате всплывающих окон, но по какой-то причине подумал (вероятно, потому, что я никогда не использовал его на практике), что WillPopScope работает только для кнопки «Назад», а не для всех всплывающих окон. Спасибо! Для тех, кому это нужно: WillPopScope работает для темной области над листом и для кнопки «Назад», но панель все равно можно закрыть, проведя пальцем вниз. Но я исправил это, добавив пустой onVerticalDragStart детектор
2. Рад слышать, что это помогает!