我试图将 CupertinoPicker 放在要与showModalBottomSheet()
一起显示的 BottomSheet 中。这将显示在错误下方,但是如果直接放置在主布局(调用模态的位置)中,则相同的代码也可以正常工作。
错误:
必须将非空字符串提供给“文本”窗口小部件。 'package:flutter / src / widgets / text.dart': 断言失败:第285行pos 10:“ data!= null”
代码:
Container(
height: 150.00,
child: CupertinoPicker(
itemExtent: 30.00,
children: <Widget>[
Text('a'),
Text('b'),
Text('c'),
Text('d'),
Text('e'),
],
onSelectedItemChanged: (newIndex){
},
),
),
有什么想法为什么不起作用以及任何解决方法?
我的BottomSheet布局的代码为here:
答案 0 :(得分:0)
通过单击外部关闭叠加层时,它将返回空值。我认为不可能轻易地覆盖此行为。
要返回当前值,您需要添加一个调用 Navigator.pop 的按钮,并且需要存储选择器的当前值(小部件的内部状态)。
floatingActionButton: FloatingActionButton(
onPressed: () async {
final data = await showModalBottomSheet<String>(
context: context,
builder: (context) {
return TextPicker(
// Passing values
values: ['a', 'b', 'c', 'd', 'e'],
);
},
);
if (data == null) {
print('Null value returned');
} else {
print('Data is $data');
}
},
),
class TextPicker extends StatefulWidget {
final List<String> values;
const TextPicker({Key key, @required this.values}) : super(key: key);
@override
_TextPickerState createState() => _TextPickerState();
}
class _TextPickerState extends State<TextPicker> {
int selectedIndex = 0;
@override
Widget build(BuildContext context) {
return Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Container(
height: 150.00,
child: CupertinoPicker(
itemExtent: 30.00,
// Mapping values to widgets
children: widget.values.map((v) => Text(v)).toList(),
onSelectedItemChanged: (newIndex) {
// Changing current index
selectedIndex = newIndex;
},
),
),
CupertinoButton(
child: Text('Ok'),
onPressed: () {
// Returning selected value
Navigator.of(context).pop(widget.values[selectedIndex]);
},
)
],
);
}
}