【发布时间】:2021-10-22 17:03:10
【问题描述】:
我正在使用 OpenWeatherMap API 构建一个天气应用程序。
每当我传递纬度和经度时,我都会正确获取数据:
Future<dynamic> getWeatherData(double latitude, double longitude) async{
Network network = Network();
var weatherData = await network.getJson("https://api.openweathermap.org/data/2.5/weather?lat=$latitude&lon=$longitude&appid=$APP_ID&units=metric");
return weatherData;
}
我正在像这样使用weatherData:
void updateWeather(dynamic weatherData){
Weather weather = Weather();
setState(() {
if (weatherData == null){
temperature = 0;
temperatureIcon = "????";
temperatureText = "Can't find weather, make sure GPS is on";
return;
}
temperature = weatherData["main"]["temp"];
int condition = weatherData["weather"][0]["id"];
temperatureIcon = weather.getWeatherIcon(condition);
temperatureText = weather.getMessage(temperature);
});
我在下面的Text() 小部件中使用temperatureIcon 和temperatureText。
现在我添加了通过搜索城市名称来获取天气的功能:
var cityName = await Navigator.push(context, MaterialPageRoute(
builder: (context){
return Search();
}
));
if (cityName != null && cityName.toString().isNotEmpty){
Weather weather = Weather();
var weatherData = weather.getWeatherDataCity(cityName);
updateWeather(weatherData);
}
getWeatherDataCity():
Future<dynamic> getWeatherDataCity(String cityName) async{
Network network = Network();
var weatherData = await network.getJson("https://api.openweathermap.org/data/2.5/weather?q=$cityName&appid=$APP_ID&units=metric");
return weatherData;
}
但是当我运行这段代码时,我得到了这个异常:
E/flutter ( 3250): [ERROR:flutter/lib/ui/ui_dart_state.cc(199)] Unhandled Exception: NoSuchMethodError: Class 'Future<dynamic>' has no instance method '[]'.
E/flutter ( 3250): Receiver: Instance of 'Future<dynamic>'
E/flutter ( 3250): Tried calling: []("main")
E/flutter ( 3250): #0 Object.noSuchMethod (dart:core-patch/object_patch.dart:54:5)
E/flutter ( 3250): #1 WeatherScreenState.updateWeather.<anonymous closure> (package:clima/screens/weather_screen.dart:39:32)
E/flutter ( 3250): #2 State.setState (package:flutter/src/widgets/framework.dart:1088:30)
E/flutter ( 3250): #3 WeatherScreenState.updateWeather (package:clima/screens/weather_screen.dart:32:5)
E/flutter ( 3250): #4 WeatherScreenState.build.<anonymous closure> (package:clima/screens/weather_screen.dart:86:25)
E/flutter ( 3250): <asynchronous suspension>
为什么会出现这个异常?
输入城市名或经纬度时收到的JSON数据是一样的。
Network.getJson():
class Network{
Future<dynamic> getJson(String url) async{
Response response = await get(Uri.parse(url));
print(response.body);
return response.statusCode >= 200 ? jsonDecode(response.body) : null;
}
}
【问题讨论】:
-
我在网络中有两种方法,一种是
getWeatherData和getJson
标签: flutter dart openweathermap