Тип аргумента ‘String?’ не может быть присвоен типу параметра ‘String’

#flutter

#трепетание

Вопрос:

когда я обновляю свой flutter до версии 2.0.1, появляется эта ошибка:

 The argument type 'String?' can't be assigned to the parameter type 'String'.
 

это мой код:

   enum SubStatus {
  SUB,
  UNSUB,
}

extension ResponseStatusExtension on SubStatus{
  static const statusCodes = {
    SubStatus.SUB: "sub",
    SubStatus.UNSUB: "unsub",
  };

  String? get statusCode => statusCodes[this];
}
 

Вот как это использовать:

URL-адрес строки = «/post/sub/source/» subStatus.StatusCode «/» Идентификатор канала;

это ошибка пользовательского интерфейса:

введите описание изображения здесь

что я должен сделать, чтобы это исправить? Я попытался вернуться String , но в коде перечисления скажите, что я должен вернуться String? :

введите описание изображения здесь

что мне делать?

Ответ №1:

Измените возвращаемый тип statusCode to String и укажите значение по умолчанию.

 String get statusCode => statusCodes[this] ?? '';
 

При обращении к карте есть вероятность, что вы получите null возвращаемое значение, если ключ не существует в карте. Простое указание значения по умолчанию позволит этому коду скомпилироваться. Это значение по умолчанию никогда не должно использоваться, если вы не добавляете что-либо в перечисление, не добавляя также значение к карте.

Ответ №2:

Редактировать: после комментария от @Christopher Moore я осознал свою ошибку. Итак, я собираюсь напрямую использовать его решение здесь, поскольку оно правильное. Это связано с новой функцией защиты от нуля в Dart.

Вам нужно будет внести следующие изменения в код, и он будет работать:

 String get statusCode => statusCodes[this] ?? '';
 

Согласно новым правилам безопасности с нулевым значением, после data-type? x типа данных следует знак вопроса, что означает, что значение x может быть нулевым. Однако без ‘?’ это означает, что data-type x он не может быть нулевым.

Итак, в основном String и String? являются двумя разными типами данных. Вот почему вы получаете ошибку.

Вы можете узнать больше здесь.

Комментарии:

1. Хотя предпосылка этого ответа верна, была причина, по которой у OP был возвращаемый тип с нулевым значением. При оценке statusCodes сопоставления существует вероятность возврата null в глазах компилятора. Им необходимо выполнить проверку на нуль и предоставить значение по умолчанию, если они ожидают вернуть значение, не String равное нулю. Таким образом, предоставленный вами код не будет компилироваться с нулевой безопасностью.

2. но в этой строке скажите мне возвращаемую строку? ====> String get statusCode => statusCodes[this]; @Прит Шах

3. Да, я согласен с этим @ChristopherMoore. После вашего комментария я немного поискал и нашел эту статью на Medium, которая помогает мне понять enum extensions . Я внесу необходимые изменения.

Ответ №3:

перезапустите сервер анализа

добавьте ! вот так subStatus.statusCode!

Комментарии:

1. Почему необходимо перезапустить сервер анализа?

2. возможно, некоторые изменения в анализаторе вызывают некоторые проблемы после защиты от null

3. Возможно, но это маловероятно, если в других местах есть явные проблемы, которые приведут к тому, что статический анализ покажет ошибку, как и ожидалось.

4. может быть, вы можете попробовать строгий режим, он будет показывать ошибку чаще