Закрыть программный левый лист программным способом в флаттере
Я показываю 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")
),
]),
);
});
Ответы
Ответ 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),
);
},
);
});
}
Выход:
Отображение и сокрытие 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"),
),
),
);
}
Выход: