BottomSheet中的CupertinoPicker'数据!= null'错误

时间:2019-11-18 12:35:30

标签: flutter dart

我试图将 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){
        },
      ),
    ),

有什么想法为什么不起作用以及任何解决方法?

enter image description here

我的BottomSheet布局的代码为here

1 个答案:

答案 0 :(得分:0)

通过单击外部关闭叠加层时,它将返回空值。我认为不可能轻易地覆盖此行为。

要返回当前值,您需要添加一个调用 Navigator.pop 的按钮,并且需要存储选择器的当前值(小部件的内部状态)。

demo

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]);
          },
        )
      ],
    );
  }
}