#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. может быть, вы можете попробовать строгий режим, он будет показывать ошибку чаще