Flutter - 不可为 null 的局部变量 'newTaskTitle' 必须先赋值才能使用

Flutter - The non-nullable local variable 'newTaskTitle' must be assigned before it can be used

您好,我收到了这个错误 - “不可为 null 的局部变量 'newTaskTitle' 必须先赋值才能使用。(文档)尝试给它一个初始化表达式,或确保它已赋值在每条执行路径上。”在构建我的 flutter 应用程序时。我正在学习于安琪的udemy课程。

class AddTaskScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    late String newTaskTitle;
    return Container(
      color: const Color(0xff757575),
      child: Container(
        padding: const EdgeInsets.all(25),
        decoration: const BoxDecoration(
          color: Colors.white,
          borderRadius: BorderRadius.only(
            topLeft: Radius.circular(20),
            topRight: Radius.circular(20),
          ),
        ),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.stretch,
          children: [
            const Text(
              'Add task',
              textAlign: TextAlign.center,
              style: TextStyle(color: Colors.lightBlueAccent, fontSize: 30.0),
            ),
            TextField(
              autofocus: true,
              textAlign: TextAlign.center,
              onChanged: (newText) {
                newTaskTitle = newText;
              },
            ),
            const SizedBox(height: 20),
            TextButton(
              child: const Text(
                'Add',
                style: TextStyle(color: Colors.white),
              ),
              style: TextButton.styleFrom(
                backgroundColor: Colors.lightBlueAccent,
              ),
              onPressed: () {
                print(newTaskTitle);
              },
            ),
          ],
        ),
      ),
    );
  }
}

如果我将 String newTaskTitle 设置为 - late String newTaskTitle

late String newTaskTitle;

当我打印 'newTaskTitle' 变量时显示以下错误- "======== Exception caught by gesture ================ =============================================== 处理手势时抛出以下 LateError: LateInitializationError: 本地 'newTaskTitle' 尚未初始化。"

这是我在 Whosebug 上的第一个 post,非常感谢您的帮助!

这个错误告诉你到底是什么问题。 您是说您将在 'later' 时间初始化 newTaskTitle 的值,但这必须在您使用它之前。通常您使用 late 变量初始化,因为您需要将一些数据传递到对象或小部件中以对其进行初始化。

late String newTaskTitle;

我可以在 TextField 小部件中看到,当文本更改时,您将其分配给 newTaskTitle

TextField(
  ...
  onChanged: (newText) {
    newTaskTitle = newText;
  },
),

如果您先更改 TextField 文本,然后按 TextButton 您应该看不到错误。

您也可以尝试在创建变量时只提供一个默认值

String newTaskTitle = '';

我总是建议,如果您是 Dart 的新手并且 null-safety,请完成此代码实验室,这将为您省去很多麻烦:https://dart.dev/codelabs/null-safety