#flutter #dart
Вопрос:
В моем старом проекте я использовал метод для выполнения операции get в dart, где я обычно возвращал значение null, если вывод был неверным.
Мой код —
Future<Map<String, dynamic>> get(String url) async {
final response = await http.get(
Uri.parse(url),
headers: basicHeaderInfo()
);
if (response.statusCode == 200) {
return jsonDecode(response.body);
} else if (response.statusCode == 401) {
ErrorResponse res = ErrorResponse.fromJson(jsonDecode(response.body));
return null;
} else {
ErrorResponse res = ErrorResponse.fromJson(jsonDecode(response.body));
ToastMessage.error(res.message);
return null;
}
}
Мой класс ответов на ошибки —
class ErrorResponse {
String message;
String errors;
ErrorResponse({
this.errors,
this.message,
});
factory ErrorResponse.fromJson(Map<String, dynamic> json) {
return ErrorResponse(
errors: json["errors"],
message: json["message"],
);
}
}
Они были лучшими до нулевой безопасности,но недавно я решил перейти в нулевую безопасность, и мое истинное образование только началось.
В моем get
методе я сталкиваюсь с ошибкой, которая выдает сообщение об ошибке
A value of type 'Null' can't be returned from the method 'get' because it has a return type of 'Future<Map<String, dynamic>>'
Не знаю, как я с этим справлюсь.
И в классе есть еще одно сообщение об ошибке
"The parameter 'errors' can't have a value of 'null' because of its type, but the implicit default value is 'null'.
Я решил эту проблему следующим образом —
class ErrorResponse {
String message;
String errors;
ErrorResponse({
this.errors = "",
this.message = "",
});
factory ErrorResponse.fromJson(Map<String, dynamic> json) {
return ErrorResponse(
errors: json["errors"],
message: json["message"],
);
}
}
Не знаю, является ли это Общепринятым Или Нетрадиционным.
Ответ №1:
Вы должны использовать:
Future<Map<String, dynamic>?>
String? message;
String? errors;
Прочтите эти статьи:
Комментарии:
1. Я попробовал этот способ, и это вызывает еще одну проблему, когда я пытаюсь использовать метод,например, ths = Map<Строка, динамическая> mapResponse = ожидание ApiMethod.get(ApiUrls.url1,) сообщение об ошибке мигает = <Строка,динамическая><Карта<строка,динамическая>?<строка, динамическая>> не может назначить <строка,динамическая>><Карта<строка,динамическая><строка,динамическая>>
2. В сообщении об ошибке четко объясняется мотив, вы не можете установить значение, которое принимает значение null, для одной переменной, которая этого не делает. Вы читали статьи, о которых я упоминал выше?
Ответ №2:
Лучшим вариантом, который я могу придумать в этом сценарии, будет
throw Exception;
И используйте обработку исключений (попробуйте и поймайте) в получающем коде.
Другой вариант-вернуть пустой объект или строку и проверить их позже в коде.
Комментарии:
1. да, я использую этот способ, return {}; вместо возврата null; вопрос в том, является ли это обычным способом?
2. Да, это обычный способ.
3. Если есть ошибка, выбросьте исключение, иначе просто верните и опустошите объект.