Подтвердить что ты не робот

Закрыть программный левый лист программным способом в флаттере

Я показываю BottomSheet с помощью showModalBottomSheet<Null>() и внутри нескольких виджетов с помощью GestureDetector. Я хотел бы, чтобы BottomSheet закрывался не только прикосновением к нему, но и после события onTap объекта GestureDetector. Однако, похоже, GestureDetector не передает событие касания.

Поэтому мне интересно, есть ли способ инициировать закрытие ModalBottomSheet программным способом или способ сообщить GestureDetector отправить событие касания?

Обновление (2018-04-12):

Следуя фрагменту кода для лучшего понимания. Проблема в том, что ModalBottomSheet не закрывается при нажатии на "Item 1" или "Item 2".

showModalBottomSheet<Null>(context: context, builder: (BuildContext context)
{
  return new SingleChildScrollView(child:
    new Column(crossAxisAlignment: CrossAxisAlignment.stretch, children: [
      new GestureDetector(onTap: () { doSomething(); }, child:
        new Text("Item 1")
      ),
      new GestureDetector(onTap: () { doSomething(); }, child:
        new Text("Item 2")
      ),
    ]),
  );
});
4b9b3361

Ответ 1

Я не мог узнать, как передать событие, пойманное GestureDetector. Тем не менее, закрытие ModalBottomSheet программно выполняется через

Navigator.pop(context);

Поэтому я просто вызываю эту поп-функцию внутри функции обратного вызова onTap GestureDetector.

showModalBottomSheet<Null>(context: context, builder: (BuildContext context)
{
  return new SingleChildScrollView(child:
    new Column(crossAxisAlignment: CrossAxisAlignment.stretch, children: [
      new GestureDetector(onTap: () {
          Navigator.pop(context);
          doSomething();
        }, child:
        new Text("Item 1")
      ),
      new GestureDetector(onTap: () {
          Navigator.pop(context);
          doSomething();
        }, child:
        new Text("Item 2")
      ),
    ]),
  );
});

Ответ 2

Обычно есть 2 типа нижнего листа.

(I) showModalBottomSheet//работает как Dialog, а не является частью Scaffold

(II) showBottomSheet//это часть Scaffold


Показ и скрытие showModalBottomSheet

Этот код показывает нижний лист и скрывает его при нажатии на FlutterLogo

@override
void initState() {
  super.initState();
  Timer.run(() {
    showModalBottomSheet(
      context: context,
      builder: (_) {
        return GestureDetector(
          onTap: () => Navigator.of(context).pop(), // closing showModalBottomSheet
          child: FlutterLogo(size: 200),
        );
      },
    );
  });
}

Выход:

enter image description here


Отображение и сокрытие showBottomSheet

Этот код показывает кнопку, которая будет открывать и закрывать нижний лист.

PersistentBottomSheetController _controller;
GlobalKey<ScaffoldState> _key = GlobalKey();
bool _open = false;

@override
Widget build(BuildContext context) {
  return Scaffold(
    key: _key,
    body: Center(
      child: RaisedButton(
        onPressed: () {
          if (!_open) {
            _controller = _key.currentState.showBottomSheet(
              (_) => SizedBox(
                child: FlutterLogo(size: 200),
                width: double.maxFinite,
              ),
            );
          } else {
            _controller.close();
          }
          setState(() => _open = !_open);
        },
        child: Text(_open ? "Close" : "Open"),
      ),
    ),
  );
}

Выход:

enter image description here