flutter 此代码返回错误“意外空值”

bf1o4zei  于 2023-01-27  发布在  Flutter
关注(0)|答案(2)|浏览(158)

下面是我的代码

class FakturPage extends StatefulWidget {
  const FakturPage({Key? key}) : super(key: key);

  static String id = 'fakturpage';

  @override
  State<FakturPage> createState() => _FakturPageState();
}

class _FakturPageState extends State<FakturPage> {

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        children: [
          DropdownTextfield(),
        ],
      ),
    );
  }
}

这是DropdownTextfield小部件代码,我尝试在其中创建一个UI,该UI显示一个Textfield和一个DropdownButton,该按钮具有从其上方的Textfield输入的选项。

class DropdownTextfield extends StatefulWidget {

  @override
  _DropdownTextfieldState createState() => _DropdownTextfieldState();
}

class _DropdownTextfieldState extends State<DropdownTextfield> {

  var selectedOption;
  TextEditingController textfieldValue = TextEditingController();
  final List<String> options = [];

  @override
  void initState() {
    super.initState();
    selectedOption = (options.isNotEmpty ? options[0] : null)!;
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      children: <Widget>[
        TextField(
          onChanged: (value) {
            setState(() {
              value = textfieldValue.text;
            });
          },
        ),
        DropdownButton<String>(
          value: selectedOption,
          onChanged: (value) {
            setState(() {
              selectedOption = value!;
            });
          },
          items: options.map((option) {
            return DropdownMenuItem<String>(
              value: option,
              child: Text(option),
            );
          }).toList(),
        ),
        TextButton(
          onPressed: () {
            setState(() {
              options.add(textfieldValue.text);
            });
          },
          child: Text("Add Option"),
        ),
      ],
    );
  }
}

我不知道哪里出了问题。我试着找出我的自定义下拉窗口小部件是否有问题,但我找不到任何问题。我已经尝试修复这个问题近一个小时没有找到解决方案,因为我是移动开发世界的新手。你能帮助我吗?

j9per5c4

j9per5c41#

问题是您使用的是空Assert(!),尽管您正在执行空检查。
替换

selectedOption = (options.isNotEmpty ? options[0] : null)!;

selectedOption = options.isNotEmpty ? options[0] : null;
6yt4nkrj

6yt4nkrj2#

您使用零安全 dart 功能的方式存在问题。
我已经测试了你的代码和下拉文本字段。问题是在options列表中是空的。这个问题的关键是你如何在下拉文本字段中使用感叹号:

@override
  void initState() {
    super.initState();
    selectedOption = (options.isNotEmpty ? options[0] : null)!;
  }

这段代码的工作原理如下:

  • 如果options列表不为空-取其第一个值并分配给selectedOption
  • 如果其空-selectedOption为空

但是在末尾加上感叹号,你就意味着Dart编译器不会有任何空值,所以,这就是你的错误产生的地方。

如何解决此问题?

  • 应该为selectedOption定义任何缺省值
  • 或者默认情况下将一些元素添加到options列表中

此外,还可以查看Dart documentation explaining null-safety的官方功能:

相关问题