Я просматриваю галерею Flutter в поисках кода, связанного с CupertinoPicker.
Вот соответствующий фрагмент кода:
child: new GestureDetector(
// Blocks taps from propagating to the modal sheet and popping.
// onTap: () { },
child: new SafeArea(
child: new CupertinoPicker(
scrollController: scrollController,
itemExtent: _kPickerItemHeight,
backgroundColor: CupertinoColors.white,
onSelectedItemChanged: (int index) {
setState(() {
print(_selectedItemIndex);
_selectedItemIndex = index;
});
},
children: new List<Widget>.generate(coolColorNames.length, (int index) {
return new Center(child:
new Text(coolColorNames[index]),
);
}),
),
),
),
Теперь мне нужен обратный вызов / слушатель, когда закрывается CupertinoPicker, другими словами, когда пользователь сделал свой выбор и его выбор окончательный, мне нужно знать, каков его окончательный выбор.
Пример использования здесь заключается в том, что я хочу выполнить обратный вызов api на основе его окончательного выбора при закрытии нижнего листа.
На данный момент я могу получить значения только по мере того, как средство выбора запускается пользователем, поскольку есть только обратный вызов для onSelectedItemChanged. См. Гифку ниже.
Я вижу, что у виджета BottomSheet есть обратный вызов onClosing: https://docs.flutter.io/flutter/material/BottomSheet-class.html
Но я не понимаю, как я могу получить его экземпляр для использования, поскольку образец Flutter Gallery вызывает нижний лист, используя следующий код, и нет способа получить нижний лист из кода:
new GestureDetector(
onTap: () async {
await showModalBottomSheet<void>(
context: context,
builder: (BuildContext context) {
return _buildBottomPicker();
},
);
},
child: _buildMenu(),
),
Кто-нибудь знает, как я могу получить для этого прослушиватель обратного вызова?
РЕДАКТИРОВАТЬ. На основе решения Реми я добавил код Navigator.of (context) .pop (value) в обратный вызов onTap. Однако CupertinoPicker не является постоянным, поэтому, если пользователь касается за пределами средства выбора, средство выбора закрывается и возвращается нулевое значение:
Widget _buildBottomPicker() {
final FixedExtentScrollController scrollController =
new FixedExtentScrollController(initialItem: _selectedItemIndex);
return new Container(
height: _kPickerSheetHeight,
color: CupertinoColors.white,
child: new DefaultTextStyle(
style: const TextStyle(
color: CupertinoColors.black,
fontSize: 22.0,
),
child: new GestureDetector(
// Blocks taps from propagating to the modal sheet and popping.
onTap: () { Navigator.of(context).pop(_selectedItemIndex);},
child: new SafeArea(
child: new CupertinoPicker(
scrollController: scrollController,
itemExtent: _kPickerItemHeight,
backgroundColor: CupertinoColors.white,
onSelectedItemChanged: (int index) {
setState(() {
// print(_selectedItemIndex);
// Navigator.of(context).pop(index);
_selectedItemIndex = index;
});
},
children: new List<Widget>.generate(coolColorNames.length, (int index) {
return new Center(child:
new Text(coolColorNames[index]),
);
}),
),
),
),
),
);
}
WillPopScope
- person Pavel   schedule 24.09.2019