Параметр не может иметь значение 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"

Другие вопросы по тегам