Параметр не может иметь значение null из-за его типа в Dart.
Функция дротика
У меня есть следующая функция Dart, и теперь я использую нулевую безопасность:
void calculate({int factor}) {
// ...
}
Анализатор жалуется, что:
Параметр "фактор" не может иметь значение "ноль" из-за его типа, а значение по умолчанию, отличное от нуля, не предоставляется.
Виджет Flutter
Это также относится к моему
StatelessWidget
во Flutter:
class Foo extends StatelessWidget {
const Foo({Key key}): super(key: key);
// ...
}
Я получаю следующую ошибку:
Параметр key не может иметь значение null из-за его типа, и значение по умолчанию, отличное от NULL, не предоставляется.
Как я могу решить эту проблему?
7 ответов
Почему
Причина, по которой это происходит, заключается в том, что с включенной нулевой безопасностью ваш параметр, не допускающий значения NULLfactor
или же
key
не может быть
null
.
В функции и конструкторе эти значения могут быть
null
когда функция вызывается без указанного параметра:
calculate()
или же
Foo()
. Однако поскольку типы (int
и
Key
) не допускают значения NULL, это недопустимый код - они никогда не должны иметь значение NULL.
Решения
По сути, есть три способа решить эту проблему:
required
Это, вероятно, наиболее распространенным решением этой проблемы, и это указывает на то, что переменная должна быть установлена. Это означает, что если у нас есть (обратите внимание на
required
ключевое слово):
void calculate({required int factor}) {
// ...
}
Указываем, что
factor
параметр всегда должен быть указан, что решает проблему, потому что только
calculate(factor: 42)
и другие. будут действительными вызовами функции.
Значение по умолчанию
Другое решение - предоставить значение по умолчанию. Если наш параметр имеет значение по умолчанию, мы можем безопасно не указывать параметр при вызове функции, потому что вместо него будет использоваться значение по умолчанию:
void calculate({int factor = 42}) {
// ...
}
Теперь
calculate()
звонок будет использовать
42
как
factor
, который, очевидно, не равен нулю.
Обнуляемый параметр
Третье решение - это то, что вы действительно хотите рассмотреть, т.е. хотите ли вы иметь параметр, допускающий значение NULL? Если это так, вам придется обнулить параметр при использовании его в вашей функции.
Тем не менее, именно так вы чаще всего хотите решить
Key key
проблема, потому что вы не всегда хотите предоставлять ключ к своему виджету во Flutter (обратите внимание на
Key?
тип):
class Foo extends StatelessWidget {
const Foo({Key? key}): super(key: key);
// ...
}
Теперь вы можете спокойно строить
Foo()
без предоставления ключа.
Если я получу эту ошибку из
constructor
класса указывая
key
, я добавляю "'отметка перед
Key
как это:
const ClassName({Key? key}) : super(key: key);
'
?
'означает, что может быть
nullable
Добавить необходимую функцию для Eg
required Key key,
required this.id,
required this.name,
required this.code,
required this.img,
required this.price,
required this.promotionPrice,
required this.size,
required this.color,
В качестве дополнительной информации к предыдущему ответу @creativecreatorormaybenot вы также можете использовать позиционные параметры (без фигурных скобок), которые являются обязательными по умолчанию, поэтому не допускают значения NULL.
void calculate(int factor) {
// ...
}
и вызывается без имени параметра:
calculate(12);
Такие параметры можно использовать в конструкторах следующим образом:
class Foo extends StatelessWidget {
final String myVar;
const Foo(this.myVar, {Key? key}): super(key: key);
// ...
}
и "могут следовать либо именованные параметры, либо необязательные позиционные параметры (но не оба сразу)" , см. документ здесь: параметры dart
Интересный ответ о разнице между именованными и позиционными параметрами: в чем разница между именованными и позиционными параметрами в Dart?
Добавьте необходимое ключевое слово перед переменной в конструкторе, а также добавьте '?' рядом с Ключом.
MyHomePage({Key? key, required this.title}) : super(key: key);
изменить версию SDK в pubspec
environment:
sdk: ">=2.7.0 <3.0.0"
Изменение версии SDK в pubspec.yaml решает проблемы:
среда: SDK: ">=2.1.0 <3.0.0"