颤振异常处理当用户输入不正确的城市名称时显示错误消息



我使用openweathermap之一来获取基于城市名称的纬度和经度。当用户输入一个无效的城市名时,这是api的响应。

如何捕获此错误并向用户显示错误消息。

这是调用api的函数。

Constants myConstaints = Constants();
Future<CityInfo> gettingCityData(String cityName) async {
  var url = Uri.parse(
      'https://api.openweathermap.org/geo/1.0/direct?q=$cityName&limit=1&appid=${myConstaints.apiKey}');
  var response = await http.get(url);
  if (response.statusCode == 200) {
    var i = CityInfo.fromJson(jsonDecode(response.body));
    return i;
  } else
    throw Exception('error');
}

CityInfo类及其构造函数

class CityInfo {
  String name;
  double lat;
  double long;
  CityInfo.fromJson(List<dynamic> json)
      : name = json[0]['name'],
        lat = json[0]['lat'].toDouble(),
        long = json[0]['lon'].toDouble();
}

提供者

 Future<void> cityName(String cityName) async {
    cityInfo = await gettingCityData(cityName);
    notifyListeners();
  }

API返回一个城市列表。它可以返回一个空列表。

首先,CityInfo.fromJson不应该接受列表作为输入。它应该只关注将CityInfo JSON对象转换为CityInfo对象。

class CityInfo {
  String name;
  double lat;
  double long;
  CityInfo.fromJson(Map<String, dynamic> json)
      : name = json['name'],
        lat = json['lat'].toDouble(),
        long = json['lon'].toDouble();
}

现在,注意CityInfo可以是空的,所以你的future应该返回一个可空的CityInfo

Future<CityInfo?> gettingCityData(String cityName)

现在处理请求,

Future<CityInfo?> gettingCityData(String cityName) async {
  final url = Uri.parse(
      'https://api.openweathermap.org/geo/1.0/direct?q=$cityName&limit=1&appid=${myConstaints.apiKey}');
  final response = await http.get(url);
  if (response.statusCode == 200) {
    final List<dynamic> data = jsonDecode(response.body);
    if (data.isEmpty) return null; // List is empty.
    
    final cityJson = data.first as Map<String, dynamic>;
    return CityInfo.fromJson(cityJson);
  } else
    throw Exception('Error');
  }
}

现在,方法可以被调用为

Future<void> cityName(String cityName) async {
    cityInfo = await gettingCityData(cityName);
    if (cityInfo == null) {
        // City was not found. Show some message here.
    }
    notifyListeners();
}

最新更新