如何将返回空值的方法转换为“空值安全”。

时间:2021-05-30 16:18:18

标签: flutter dart

在我的旧项目中,我在dart中使用了一种方法来执行get操作,如果输出无效,我曾经在那里返回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>>'

不知道怎么处理。 而在 Class 中,还有一条错误信息

"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"],
    );
  }
}

不知道这是常规还是非常规。

2 个答案:

答案 0 :(得分:1)

在这种情况下我能想到的最佳选择是

throw Exception;

并在接收代码中使用异常处理(try and catch)。 另一种选择是返回一个空对象或字符串,然后在代码中进行检查。

答案 1 :(得分:1)

你应该使用:

Future<Map<String, dynamic>?>
String? message;
String? errors;

阅读这些文章:

https://dart.dev/null-safety

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