Reputation: 3023
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
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
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
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