错误:NoSuchMethodError:方法'toDouble'被调用为null。接收方:null尝试调用:toDouble()

时间:2019-11-05 02:58:56

标签: json flutter dart mockito tdd

我正在尝试使用fromJson函数来解析json文件。但是在运行测试时,我收到此错误消息。

  

错误:NoSuchMethodError:方法'toDouble'在null上调用。   接收者:null   尝试调用:toDouble()

我不确定这是怎么回事。

我的代码

  

weather_model_app_test.dart

group('fromJson', () {
    test('should return a valid model', () async {
      final Map<String, dynamic> jsonMap =
          json.decode(fixture('weather_app.json'));
      //act
      final result = WeatherAppModel.fromJson(jsonMap);
      //assert
      expect(result, tWeatherAppModel);
    });
  });
  

weather_app_model.dart

factory WeatherAppModel.fromJson(Map<String, dynamic> json) {
    return WeatherAppModel(
      weatherMain: json['weather'][0]['main'],
      weatherDescription: json['weather'][0]['description'],
      temp: (json['main']['temp'] as double).toDouble(),
      minTemp: (json['main']['temp_min'] as double).toDouble(),
      maxTemp: (json['main']['temp_main'] as double).toDouble(),
      country: json['sys']['country'],
    );
  }
  

fixtures / weather_app.dart

{
  "coord": {
    "lon": 78,
    "lat": 20
  },
  "weather": [
    {
      "id": 500,
      "main": "Rain",
      "description": "light rain",
      "icon": "10d"
    }
  ],
  "base": "model",
  "main": {
    "temp": 301.51,
    "pressure": 1014,
    "humidity": 67,
    "temp_min": 301.51,
    "temp_max": 301.51,
    "sea_level": 1014,
    "grnd_level": 979
  },
  "wind": {
    "speed": 3.19,
    "deg": 77
  },
  "rain": {
    "3h": 1.81
  },
  "clouds": {
    "all": 45
  },
  "dt": 1572672029,
  "sys": {
    "country": "IN",
    "sunrise": 1572655775,
    "sunset": 1572696807
  },
  "timezone": 19800,
  "id": 1272596,
  "name": "Digras",
  "cod": 200
}

3 个答案:

答案 0 :(得分:3)

主要问题是您没有提供 screenWidth 和 screenHeight 值。如果您提供它会解决您的问题。

当你的widget调用它时会调用realH但是screenWidth的值没有定义,所以它不能计算值也不能返回值。

  screenWidth = MediaQuery.of(context).size.width; 
screenHeight = MediaQuery.of(context).size.height;
 if (screenWidth > standardWidth) { 
   screenWidth = standardWidth;
  } 
 if (screenHeight > standardHeight) { 
    screenHeight = standardHeight;
 } 

或者你可以制作一个单独的文件 size_config.dart 并在其中添加以下代码

import 'package:flutter/material.dart';

class SizeConfig {
  static MediaQueryData _mediaQueryData;
  static double screenWidth;
  static double screenHeight;
  static double defaultSize;
  static Orientation orientation;

  void init(BuildContext context) {
    _mediaQueryData = MediaQuery.of(context);
    screenWidth = _mediaQueryData.size.width;
    screenHeight = _mediaQueryData.size.height;
    orientation = _mediaQueryData.orientation;
  }
}

// Get the proportionate height as per screen size
double getProportionateScreenHeight(double inputHeight) {
  double screenHeight = SizeConfig.screenHeight;
  // 812 is the layout height that designer use
  return (inputHeight / 812.0) * screenHeight;
}

// Get the proportionate height as per screen size
double getProportionateScreenWidth(double inputWidth) {
  double screenWidth = SizeConfig.screenWidth;
  // 375 is the layout width that designer use
  return (inputWidth / 375.0) * screenWidth;
}

并在屏幕上返回 Scaffold 之前输入此代码

 SizeConfig().init(context);

答案 1 :(得分:2)

不应该 maxTemp: (json['main']['temp_main'] as double).toDouble(),

在weather_app_model.dart文件中是[temp_max]而不是[temp_main]

答案 2 :(得分:0)

import 'package:flutter/material.dart';
import 'components/body.dart';
import 'package:xplore/constants/size_config.dart';

class SignInScreen extends StatelessWidget {
  static String routeName = "/login";
  @override
  Widget build(BuildContext context) {
    **SizeConfig().init(context);**------> all this line
    return Scaffold(
      body: Body(),
    );
  }
}