Как преобразовать метод, возвращающий значение null, в «нулевую безопасность».

#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;
 

Прочтите эти статьи:

https://dart.dev/null-safety

https://dart.dev/null-safety/understanding-null-safety

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

1. Я попробовал этот способ, и это вызывает еще одну проблему, когда я пытаюсь использовать метод,например, ths = Map<Строка, динамическая> mapResponse = ожидание ApiMethod.get(ApiUrls.url1,) сообщение об ошибке мигает = <Строка,динамическая><Карта<строка,динамическая>?<строка, динамическая>> не может назначить <строка,динамическая>><Карта<строка,динамическая><строка,динамическая>>

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

Ответ №2:

Лучшим вариантом, который я могу придумать в этом сценарии, будет

 throw Exception;
 

И используйте обработку исключений (попробуйте и поймайте) в получающем коде.
Другой вариант-вернуть пустой объект или строку и проверить их позже в коде.

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

1. да, я использую этот способ, return {}; вместо возврата null; вопрос в том, является ли это обычным способом?

2. Да, это обычный способ.

3. Если есть ошибка, выбросьте исключение, иначе просто верните и опустошите объект.