【问题标题】:Unhandled Exception: NoSuchMethodError: Class 'Future<dynamic>' has no instance method '[]' when getting data from openweathermap未处理的异常:NoSuchMethodError:从 openweathermap 获取数据时,类 'Future<dynamic>' 没有实例方法 '[]'
【发布时间】: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


【解决方案1】:

尝试等待这个函数:

var weatherData = await weather.getWeatherDataCity(cityName);

如果您消除所有 dynamic 和 var 和使用的对象,生活也会轻松很多,代码会更有意义。

【讨论】:

    猜你喜欢
    • 2021-05-29
    • 2021-04-20
    • 2021-11-24
    • 2021-07-12
    • 1970-01-01
    • 2021-08-02
    • 2022-11-21
    • 2019-12-13
    • 2020-12-19
    相关资源
    最近更新 更多