Возможно ли сделать нижний лист не закрываемым?

#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. Рад слышать, что это помогает!