错误:Flutter 中的“手势捕获异常”

时间:2021-05-05 11:11:46

标签: flutter textfield

我正在尝试将数据存储在一个类中以存储此信息并在以后使用它们,但我收到此错误消息并且无法找出我必须更改的内容才能使其正常工作。这是我的代码的简化版本,我遇到了同样的错误。


class LUI {
  String lui;

  LUI({
    this.lui,
  });
}

class Test extends StatefulWidget {
  final LUI data;

  Test({
    Key key,
    this.data,
  });

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

class _TestState extends State<Test> {
  TextEditingController _controller = new TextEditingController();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Container(
                child: Container(
                    child: TextField(
              controller: _controller,
              keyboardType: TextInputType.number,
            ))),
            TextButton(
              child: Text('add information'),
              onPressed: () {
                _sendresult(context);
                print(widget.data.lui);
              },
            ),
          ],
        ),
      ),
    );
  }

  void _sendresult(BuildContext context) {
    final result = _controller.text;
    print(result);
    setState(() {
      widget.data.lui = result;
    });
  }
}```

2 个答案:

答案 0 :(得分:0)

我必须从创建 Test 类的实例的位置发送数据参数的值。谢谢 Sisir 的回答。

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        title: 'Basis',
        theme: ThemeData(
          primaryColor: Colors.red,
          textTheme: TextTheme(
            headline1: TextStyle(
              fontSize: 40,
              fontWeight: FontWeight.w600,
              color: Colors.black,
            ),
          ),
        ),
        home: Test(data: new LUI()));
  }
}

答案 1 :(得分:0)

问题在于,Test 类期望为 data 参数传递一个值。但是,由于您在创建实例时没有向其传递任何值,这使得该字段保持为空。

稍后当您访问 print(widget.data.lui); 中的相同字段时,它会生成一个 null pointer exception。正如您已经想到的,解决方法是将值传递给 data

但是,您可以以更好的方式编写代码,以便您可以在编译时捕获此错误,而不是等到运行时。

方法 1:(启用 Null-Safety)

使用关键字 required 指定必须提交,例如

  Test({
    Key key,
    required this.data,
  });

现在,有了这个,创建一个像 Test() 这样的带有参数输入的实例会抛出编译错误,抱怨缺少输入参数。

方法 2:(未启用 Null-Safety)

使用注释 @required 来指定归档是必需的,例如

  Test({
    Key key,
    @required this.data,
  });

在这种情况下,未能传递参数将引发编译时警告(黄线突出显示),与上述情况不同,它会通知您但不会阻止您的执行。