当我运行我的代码时,我收到以下错误消息:
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 中是不可修改的,即使带有“?”除了他们。
答案 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;
作为变量声明仍然有效。