可空错误,因为字符串不可为空

时间:2021-06-11 10:40:13

标签: flutter dart

当我运行我的代码时,我收到以下错误消息:

The parameter 'name' can't have a value of 'null' because of its type, but the implicit default value is 'null'. Try adding either an explicit non-'null' default value or the 'required' modifier.

这是我的代码:

import 'package:flutter/widgets.dart';
import 'package:flutter/material.dart';
import 'checkbox.dart';

class TodoItem extends StatefulWidget {
  final String name;
  final bool? isActive;

  const TodoItem({Key? key, this.name, this.isActive}) : super(key: key);

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

class _TodoItemState extends State<TodoItem> {
  @override
  Widget build(BuildContext context) {
    return Row(
      mainAxisAlignment: MainAxisAlignment.spaceAround,
      children: [
        Text(
          widget.name,
          style: TextStyle(fontSize: 17, color: Colors.grey),
        ),
        Check(
          isActive: widget.isActive,
        )
      ],
    );
  }
}

我试图用对我最后一个问题的回答来解决它,但这似乎不起作用,因为显然字符串在 Dart 中是不可修改的,即使带有“?”除了他们。

2 个答案:

答案 0 :(得分:0)

只需在构造函数中将所需的修饰符添加到 this.name 即可。您还可以将默认值设置为 isActive 而不是使其可以为 null。

class TodoItem extends StatefulWidget {
  final String name;
  final bool isActive;

  const TodoItem({
    Key? key,
    required this.name,
    this.isActive = false,
  }) : super(key: key);

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

答案 1 :(得分:0)

final String name;

在这种情况下,您不能使用 name = null,因为您将变量指定为严格的字符串。

final String? name;

通过添加 ?,您可以确保名称可以包含字符串或空值。

所以这是一种解决方案


来到构造函数部分:

TodoItem({Key? key, this.name, this.isActive}) : super(key: key);

这里,this.name 在 {} 内,这使它成为可选参数,直到指定了 required 关键字。

作为可选参数,this.name的默认值为null,违反了变量的定义。

试试

TodoItem({Key? key, required this.name, this.isActive}) : super(key: key); // the 'required' modifier.

强制分配名称变量

TodoItem({Key? key, this.name = "", this.isActive}) : super(key: key); // Try adding either an explicit non-'null'

这样,您可以确保即使未分配可选参数,默认值也不为空,

final String name;

作为变量声明仍然有效。