aditya kumar
aditya kumar

Reputation: 3023

ERROR: NoSuchMethodError: The method 'toDouble' was called on null. Receiver: null Tried calling: toDouble()

I am trying to make fromJson function which parse the json file. But while running test I am getting this error saying.

ERROR: NoSuchMethodError: The method 'toDouble' was called on null. Receiver: null Tried calling: toDouble()

I am not sure what is wrong with this.

My code

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
}

Upvotes: 0

Views: 10339

Answers (3)

Muhammad Shafique
Muhammad Shafique

Reputation: 609

Main issue is that you are not providing screenWidth and screenHeight value. if you provide it will solve your issue.

When your widget called it will call realH but screenWidth's value is not define, so it can not calculate value and it can not return value.

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

or you can make a separate file size_config.dart and add following code to it

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;
}

and enter this code before returning Scaffold on your screen

 SizeConfig().init(context);

Upvotes: 3

Jagan R
Jagan R

Reputation: 11

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

Upvotes: 1

Oprimus
Oprimus

Reputation: 1898

Shouldn't maxTemp: (json['main']['temp_main'] as double).toDouble(),

be [temp_max] instead of [temp_main] in your weather_app_model.dart file?

Upvotes: 4

Related Questions