我正在 Flutter Gallery 中查找与 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 的回调。请参见下面的 gif。
我看到 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(),
),
有谁知道我如何获得回调监听器?
编辑 - 基于 Remi 的解决方案,我在 onTap 回调中添加了 Navigator.of(context).pop(value) 代码。但是,CupertinoPicker 不是持久的,因此如果用户在选取器外部触摸,选取器会自行关闭并返回 null 值:
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]),
);
}),
),
),
),
),
);
}