2019-06-27 17:29:40 -07:00
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
import 'global_helper_functions.dart';
|
|
|
|
import 'package:intl/intl.dart';
|
|
|
|
import 'package:cached_network_image/cached_network_image.dart';
|
|
|
|
import 'dart:convert';
|
|
|
|
|
|
|
|
class WeatherForeCast extends StatefulWidget {
|
|
|
|
final String weatherForeCast;
|
|
|
|
final int timeOffSet;
|
|
|
|
|
|
|
|
WeatherForeCast({
|
|
|
|
Key key,
|
|
|
|
this.weatherForeCast,
|
|
|
|
this.timeOffSet,
|
|
|
|
}) : super(key: key);
|
|
|
|
|
|
|
|
@override
|
|
|
|
_WeatherForeCastState createState() => _WeatherForeCastState();
|
|
|
|
}
|
|
|
|
|
|
|
|
class _WeatherForeCastState extends State<WeatherForeCast> {
|
|
|
|
final double textHeight = 1.5;
|
2019-07-27 15:34:01 -07:00
|
|
|
|
2019-06-27 17:29:40 -07:00
|
|
|
@override
|
|
|
|
Widget build(BuildContext context) {
|
|
|
|
Map<String, dynamic> foreCastJson;
|
|
|
|
final double _deviceWidth = MediaQuery.of(context).size.width;
|
|
|
|
|
|
|
|
List<Container> createForeCast(List<dynamic> foreCastList) {
|
|
|
|
return foreCastList.map((foreCast) {
|
|
|
|
Map<String, String> foreCastTime =
|
|
|
|
get3WayTime(foreCast['dt'], widget.timeOffSet);
|
|
|
|
|
|
|
|
Column _conditions() {
|
|
|
|
return Column(
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.center,
|
|
|
|
children: <Widget>[
|
|
|
|
Text(
|
|
|
|
'Forecast: ',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: candyApple,
|
|
|
|
fontSize: 16,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
Text(
|
|
|
|
'${weatherConditions(foreCast['weather'][0]['description'])}',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: Colors.black,
|
|
|
|
fontSize: 18,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
RichText(
|
|
|
|
text: TextSpan(
|
|
|
|
children: <TextSpan>[
|
|
|
|
TextSpan(
|
|
|
|
text: 'Humidity: ',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: candyApple,
|
|
|
|
fontSize: 16,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
TextSpan(
|
|
|
|
text: '${foreCast['main']['humidity']}%',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: Colors.black,
|
|
|
|
fontSize: 16,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
Container _icon() {
|
|
|
|
return Container(
|
|
|
|
width: 100,
|
|
|
|
child: CachedNetworkImage(
|
2019-07-27 15:34:01 -07:00
|
|
|
imageUrl:
|
|
|
|
'http://openweathermap.org/img/w/${foreCast['weather'][0]['icon']}.png',
|
2019-06-27 17:29:40 -07:00
|
|
|
),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
Column _wind() {
|
|
|
|
return Column(
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.center,
|
|
|
|
children: <Widget>[
|
|
|
|
RichText(
|
|
|
|
text: TextSpan(
|
|
|
|
children: <TextSpan>[
|
|
|
|
TextSpan(
|
|
|
|
text: 'Wind: ',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: candyApple,
|
|
|
|
fontSize: 16,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
TextSpan(
|
|
|
|
text: '${foreCast['wind']['speed'].round()}',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: Colors.black,
|
|
|
|
fontSize: 16,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
TextSpan(
|
|
|
|
text: 'mph',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: Colors.black,
|
|
|
|
fontSize: 16,
|
|
|
|
fontStyle: FontStyle.italic,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
TextSpan(
|
|
|
|
text: ',',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: Colors.black,
|
|
|
|
fontSize: 16,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
RichText(
|
|
|
|
text: TextSpan(
|
|
|
|
children: <TextSpan>[
|
|
|
|
TextSpan(
|
|
|
|
text:
|
|
|
|
'${getKilometers(foreCast['wind']['speed'].toDouble())}',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: Colors.black,
|
|
|
|
fontSize: 16,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
TextSpan(
|
|
|
|
text: 'kph',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: Colors.black,
|
|
|
|
fontSize: 16,
|
|
|
|
fontStyle: FontStyle.italic,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
TextSpan(
|
|
|
|
text:
|
|
|
|
', ${getKnots(foreCast['wind']['speed'].toDouble())}',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: Colors.black,
|
|
|
|
fontSize: 16,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
TextSpan(
|
|
|
|
text: 'knots',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: Colors.black,
|
|
|
|
fontSize: 16,
|
|
|
|
fontStyle: FontStyle.italic,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
RichText(
|
|
|
|
text: TextSpan(
|
|
|
|
children: <TextSpan>[
|
|
|
|
TextSpan(
|
|
|
|
text: 'From: ',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: candyApple,
|
|
|
|
fontSize: 16,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
TextSpan(
|
2019-07-27 15:34:01 -07:00
|
|
|
text: '${foreCast['wind']['deg'].round()}\u00B0, ',
|
2019-06-27 17:29:40 -07:00
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: Colors.black,
|
|
|
|
fontSize: 16,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
TextSpan(
|
|
|
|
text:
|
|
|
|
'(${getDirection(foreCast['wind']['deg'].round())})',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: Colors.black,
|
|
|
|
fontSize: 16,
|
|
|
|
fontStyle: FontStyle.italic,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
);
|
|
|
|
}
|
2019-07-27 15:34:01 -07:00
|
|
|
|
2019-06-27 17:29:40 -07:00
|
|
|
Column _temp() {
|
|
|
|
return Column(
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.center,
|
|
|
|
children: <Widget>[
|
|
|
|
RichText(
|
|
|
|
// temp
|
|
|
|
text: TextSpan(
|
|
|
|
children: <TextSpan>[
|
|
|
|
TextSpan(
|
|
|
|
text: 'Temp: ',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: candyApple,
|
|
|
|
fontSize: 16,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
TextSpan(
|
2019-07-27 15:34:01 -07:00
|
|
|
text: '${foreCast['main']['temp'].round()}\u00B0',
|
2019-06-27 17:29:40 -07:00
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: Colors.black,
|
|
|
|
fontSize: 16,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
TextSpan(
|
|
|
|
text: 'F',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: Colors.black,
|
|
|
|
fontSize: 16,
|
|
|
|
fontStyle: FontStyle.italic,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
TextSpan(
|
|
|
|
text:
|
|
|
|
', ${getCelcius(foreCast['main']['temp'].toDouble())}\u00B0',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: Colors.black,
|
|
|
|
fontSize: 16,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
TextSpan(
|
|
|
|
text: 'C',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: Colors.black,
|
|
|
|
fontSize: 16,
|
|
|
|
fontStyle: FontStyle.italic,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
RichText(
|
|
|
|
// temp_min
|
|
|
|
text: TextSpan(
|
|
|
|
children: <TextSpan>[
|
|
|
|
TextSpan(
|
|
|
|
text: 'Min: ',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: candyApple,
|
|
|
|
fontSize: 16,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
TextSpan(
|
2019-07-27 15:34:01 -07:00
|
|
|
text: '${foreCast['main']['temp_min'].round()}\u00B0',
|
2019-06-27 17:29:40 -07:00
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: Colors.black,
|
|
|
|
fontSize: 16,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
TextSpan(
|
|
|
|
text: 'F',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: Colors.black,
|
|
|
|
fontSize: 16,
|
|
|
|
fontStyle: FontStyle.italic,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
TextSpan(
|
|
|
|
text:
|
|
|
|
', ${getCelcius(foreCast['main']['temp_min'].toDouble())}\u00B0',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: Colors.black,
|
|
|
|
fontSize: 16,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
TextSpan(
|
|
|
|
text: 'C',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: Colors.black,
|
|
|
|
fontSize: 16,
|
|
|
|
fontStyle: FontStyle.italic,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
RichText(
|
|
|
|
// temp_max
|
|
|
|
text: TextSpan(
|
|
|
|
children: <TextSpan>[
|
|
|
|
TextSpan(
|
|
|
|
text: 'Max: ',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: candyApple,
|
|
|
|
fontSize: 16,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
TextSpan(
|
2019-07-27 15:34:01 -07:00
|
|
|
text: '${foreCast['main']['temp_max'].round()}\u00B0',
|
2019-06-27 17:29:40 -07:00
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: Colors.black,
|
|
|
|
fontSize: 16,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
TextSpan(
|
|
|
|
text: 'F',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: Colors.black,
|
|
|
|
fontSize: 16,
|
|
|
|
fontStyle: FontStyle.italic,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
TextSpan(
|
|
|
|
text:
|
|
|
|
', ${getCelcius(foreCast['main']['temp_max'].toDouble())}\u00B0',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: Colors.black,
|
|
|
|
fontSize: 16,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
TextSpan(
|
|
|
|
text: 'C',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: Colors.black,
|
|
|
|
fontSize: 16,
|
|
|
|
fontStyle: FontStyle.italic,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
Column _time() {
|
|
|
|
return Column(
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.center,
|
|
|
|
children: <Widget>[
|
|
|
|
RichText(
|
|
|
|
text: TextSpan(
|
|
|
|
children: <TextSpan>[
|
|
|
|
TextSpan(
|
|
|
|
text: 'There: ',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: candyApple,
|
|
|
|
fontSize: 16,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
TextSpan(
|
|
|
|
text: '${foreCastTime['There']}',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: Colors.black,
|
|
|
|
fontSize: 16,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
RichText(
|
|
|
|
text: TextSpan(
|
|
|
|
children: <TextSpan>[
|
|
|
|
TextSpan(
|
|
|
|
text: 'Here: ',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: candyApple,
|
|
|
|
fontSize: 16,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
TextSpan(
|
|
|
|
text: '${foreCastTime['Here']}',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: Colors.black,
|
|
|
|
fontSize: 16,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
RichText(
|
|
|
|
text: TextSpan(
|
|
|
|
children: <TextSpan>[
|
|
|
|
TextSpan(
|
|
|
|
text: 'UTC: ',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: candyApple,
|
|
|
|
fontSize: 16,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
TextSpan(
|
|
|
|
text: '${foreCastTime['UTC']}',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: Colors.black,
|
|
|
|
fontSize: 16,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
Column _pressure() {
|
|
|
|
return Column(
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.center,
|
|
|
|
children: <Widget>[
|
|
|
|
RichText(
|
|
|
|
text: TextSpan(
|
|
|
|
children: <TextSpan>[
|
|
|
|
TextSpan(
|
|
|
|
text: 'Pressure: ',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: candyApple,
|
|
|
|
fontSize: 16,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
RichText(
|
|
|
|
text: TextSpan(
|
|
|
|
children: <TextSpan>[
|
|
|
|
TextSpan(
|
|
|
|
text: '${foreCast['main']['pressure']}',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: Colors.black,
|
|
|
|
fontSize: 16,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
TextSpan(
|
|
|
|
text: 'mb',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: Colors.black,
|
|
|
|
fontSize: 16,
|
|
|
|
fontStyle: FontStyle.italic,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
TextSpan(
|
|
|
|
text: ', ',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: Colors.black,
|
|
|
|
fontSize: 16,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
RichText(
|
|
|
|
text: TextSpan(
|
|
|
|
children: <TextSpan>[
|
|
|
|
TextSpan(
|
|
|
|
text:
|
|
|
|
'${getinHg(foreCast['main']['pressure'].toDouble())}',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: Colors.black,
|
|
|
|
fontSize: 16,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
TextSpan(
|
|
|
|
text: 'inHg',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: Colors.black,
|
|
|
|
fontSize: 16,
|
|
|
|
fontStyle: FontStyle.italic,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
TextSpan(
|
|
|
|
text: ',',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: Colors.black,
|
|
|
|
fontSize: 16,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
RichText(
|
|
|
|
text: TextSpan(
|
|
|
|
children: <TextSpan>[
|
|
|
|
TextSpan(
|
|
|
|
text:
|
|
|
|
'${getmmHg(foreCast['main']['pressure'].toDouble())}',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: Colors.black,
|
|
|
|
fontSize: 16,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
TextSpan(
|
|
|
|
text: 'mmHg',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: Colors.black,
|
|
|
|
fontSize: 16,
|
|
|
|
fontStyle: FontStyle.italic,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
Column _sea() {
|
|
|
|
return Column(
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.center,
|
|
|
|
children: <Widget>[
|
|
|
|
RichText(
|
|
|
|
text: TextSpan(
|
|
|
|
children: <TextSpan>[
|
|
|
|
TextSpan(
|
|
|
|
text: 'Sea Level: ',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: candyApple,
|
|
|
|
fontSize: 16,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
RichText(
|
|
|
|
text: TextSpan(
|
|
|
|
children: <TextSpan>[
|
|
|
|
TextSpan(
|
|
|
|
text: '${foreCast['main']['sea_level']}',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: Colors.black,
|
|
|
|
fontSize: 16,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
TextSpan(
|
|
|
|
text: 'mb',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: Colors.black,
|
|
|
|
fontSize: 16,
|
|
|
|
fontStyle: FontStyle.italic,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
TextSpan(
|
|
|
|
text: ', ',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: Colors.black,
|
|
|
|
fontSize: 16,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
RichText(
|
|
|
|
text: TextSpan(
|
|
|
|
children: <TextSpan>[
|
|
|
|
TextSpan(
|
|
|
|
text:
|
|
|
|
'${getinHg(foreCast['main']['sea_level'].toDouble())}',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: Colors.black,
|
|
|
|
fontSize: 16,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
TextSpan(
|
|
|
|
text: 'inHg',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: Colors.black,
|
|
|
|
fontSize: 16,
|
|
|
|
fontStyle: FontStyle.italic,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
TextSpan(
|
|
|
|
text: ',',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: Colors.black,
|
|
|
|
fontSize: 16,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
RichText(
|
|
|
|
text: TextSpan(
|
|
|
|
children: <TextSpan>[
|
|
|
|
TextSpan(
|
|
|
|
text:
|
|
|
|
'${getmmHg(foreCast['main']['sea_level'].toDouble())}',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: Colors.black,
|
|
|
|
fontSize: 16,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
TextSpan(
|
|
|
|
text: 'mmHg',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: Colors.black,
|
|
|
|
fontSize: 16,
|
|
|
|
fontStyle: FontStyle.italic,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
Column _ground() {
|
|
|
|
return Column(
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.center,
|
|
|
|
children: <Widget>[
|
|
|
|
RichText(
|
|
|
|
text: TextSpan(
|
|
|
|
children: <TextSpan>[
|
|
|
|
TextSpan(
|
|
|
|
text: 'Ground Level: ',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: candyApple,
|
|
|
|
fontSize: 16,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
RichText(
|
|
|
|
text: TextSpan(
|
|
|
|
children: <TextSpan>[
|
|
|
|
TextSpan(
|
|
|
|
text: '${foreCast['main']['grnd_level']}',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: Colors.black,
|
|
|
|
fontSize: 16,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
TextSpan(
|
|
|
|
text: 'mb',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: Colors.black,
|
|
|
|
fontSize: 16,
|
|
|
|
fontStyle: FontStyle.italic,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
TextSpan(
|
|
|
|
text: ', ',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: Colors.black,
|
|
|
|
fontSize: 16,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
RichText(
|
|
|
|
text: TextSpan(
|
|
|
|
children: <TextSpan>[
|
|
|
|
TextSpan(
|
|
|
|
text:
|
|
|
|
'${getinHg(foreCast['main']['grnd_level'].toDouble())}',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: Colors.black,
|
|
|
|
fontSize: 16,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
TextSpan(
|
|
|
|
text: 'inHg',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: Colors.black,
|
|
|
|
fontSize: 16,
|
|
|
|
fontStyle: FontStyle.italic,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
TextSpan(
|
|
|
|
text: ',',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: Colors.black,
|
|
|
|
fontSize: 16,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
RichText(
|
|
|
|
text: TextSpan(
|
|
|
|
children: <TextSpan>[
|
|
|
|
TextSpan(
|
|
|
|
text:
|
|
|
|
'${getmmHg(foreCast['main']['grnd_level'].toDouble())}',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: Colors.black,
|
|
|
|
fontSize: 16,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
TextSpan(
|
|
|
|
text: 'mmHg',
|
|
|
|
style: TextStyle(
|
|
|
|
height: textHeight,
|
|
|
|
color: Colors.black,
|
|
|
|
fontSize: 16,
|
|
|
|
fontStyle: FontStyle.italic,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (_deviceWidth < 400) {
|
|
|
|
return Container(
|
|
|
|
decoration: BoxDecoration(
|
|
|
|
border: Border(
|
|
|
|
bottom: BorderSide(
|
|
|
|
width: 1.0,
|
|
|
|
color: Colors.black,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
child: Column(
|
|
|
|
children: <Widget>[
|
|
|
|
Padding(
|
|
|
|
padding: EdgeInsets.symmetric(vertical: 8.0),
|
|
|
|
child: Row(
|
|
|
|
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
|
|
|
children: <Widget>[
|
|
|
|
_icon(),
|
|
|
|
_conditions(),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
Padding(
|
|
|
|
padding: EdgeInsets.symmetric(vertical: 8.0),
|
|
|
|
child: Row(
|
|
|
|
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
|
|
|
children: <Widget>[
|
|
|
|
_time(),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
Padding(
|
|
|
|
padding: EdgeInsets.symmetric(vertical: 8.0),
|
|
|
|
child: Row(
|
|
|
|
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
|
|
|
children: <Widget>[
|
|
|
|
_temp(),
|
|
|
|
_wind(),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
Padding(
|
|
|
|
padding: EdgeInsets.symmetric(vertical: 8.0),
|
|
|
|
child: Row(
|
|
|
|
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
|
|
|
children: <Widget>[
|
|
|
|
_pressure(),
|
|
|
|
_sea(),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
Padding(
|
|
|
|
padding: EdgeInsets.symmetric(vertical: 8.0),
|
|
|
|
child: Row(
|
|
|
|
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
|
|
|
children: <Widget>[
|
|
|
|
_ground(),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
);
|
|
|
|
} else if ((_deviceWidth >= 400) && (_deviceWidth < 650)) {
|
|
|
|
return Container(
|
|
|
|
decoration: BoxDecoration(
|
|
|
|
border: Border(
|
|
|
|
bottom: BorderSide(
|
|
|
|
width: 1.0,
|
|
|
|
color: Colors.black,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
child: Column(
|
|
|
|
children: <Widget>[
|
|
|
|
Padding(
|
|
|
|
padding: EdgeInsets.symmetric(vertical: 8.0),
|
|
|
|
child: Row(
|
|
|
|
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
|
|
|
children: <Widget>[
|
|
|
|
_icon(),
|
|
|
|
_conditions(),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
Padding(
|
|
|
|
padding: EdgeInsets.symmetric(vertical: 8.0),
|
|
|
|
child: Row(
|
|
|
|
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
|
|
|
children: <Widget>[
|
|
|
|
_time(),
|
|
|
|
_temp(),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
Padding(
|
|
|
|
padding: EdgeInsets.symmetric(vertical: 8.0),
|
|
|
|
child: Row(
|
|
|
|
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
|
|
|
children: <Widget>[
|
|
|
|
_pressure(),
|
|
|
|
_sea(),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
Padding(
|
|
|
|
padding: EdgeInsets.symmetric(vertical: 8.0),
|
|
|
|
child: Row(
|
|
|
|
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
|
|
|
children: <Widget>[
|
|
|
|
_ground(),
|
|
|
|
_wind(),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
);
|
|
|
|
} else if ((_deviceWidth >= 650) && (_deviceWidth < 1000)) {
|
|
|
|
return Container(
|
|
|
|
decoration: BoxDecoration(
|
|
|
|
border: Border(
|
|
|
|
bottom: BorderSide(
|
|
|
|
width: 1.0,
|
|
|
|
color: Colors.black,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
child: Column(
|
|
|
|
children: <Widget>[
|
|
|
|
Padding(
|
|
|
|
padding: EdgeInsets.symmetric(vertical: 8.0),
|
|
|
|
child: Row(
|
|
|
|
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
|
|
|
children: <Widget>[
|
|
|
|
_icon(),
|
|
|
|
_conditions(),
|
|
|
|
_temp(),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
Padding(
|
|
|
|
padding: EdgeInsets.symmetric(vertical: 8.0),
|
|
|
|
child: Row(
|
|
|
|
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
|
|
|
children: <Widget>[
|
|
|
|
_time(),
|
|
|
|
_wind(),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
Padding(
|
|
|
|
padding: EdgeInsets.symmetric(vertical: 8.0),
|
|
|
|
child: Row(
|
|
|
|
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
|
|
|
children: <Widget>[
|
|
|
|
_pressure(),
|
|
|
|
_sea(),
|
|
|
|
_ground(),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
);
|
|
|
|
} else if (_deviceWidth >= 1000) {
|
|
|
|
return Container(
|
|
|
|
decoration: BoxDecoration(
|
|
|
|
border: Border(
|
|
|
|
bottom: BorderSide(
|
|
|
|
width: 1.0,
|
|
|
|
color: Colors.black,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
child: Column(
|
|
|
|
children: <Widget>[
|
|
|
|
Padding(
|
|
|
|
padding: EdgeInsets.symmetric(vertical: 8.0),
|
|
|
|
child: Row(
|
|
|
|
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
|
|
|
children: <Widget>[
|
|
|
|
_icon(),
|
|
|
|
_conditions(),
|
|
|
|
_temp(),
|
|
|
|
_time(),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
Padding(
|
|
|
|
padding: EdgeInsets.symmetric(vertical: 8.0),
|
|
|
|
child: Row(
|
|
|
|
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
|
|
|
children: <Widget>[
|
|
|
|
_wind(),
|
|
|
|
_pressure(),
|
|
|
|
_sea(),
|
|
|
|
_ground(),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}).toList();
|
|
|
|
}
|
|
|
|
|
|
|
|
try {
|
|
|
|
foreCastJson = jsonDecode(widget.weatherForeCast);
|
|
|
|
return Container(
|
|
|
|
margin: EdgeInsets.symmetric(
|
2019-07-27 15:34:01 -07:00
|
|
|
vertical: 3,
|
|
|
|
horizontal: 6,
|
2019-06-27 17:29:40 -07:00
|
|
|
),
|
|
|
|
decoration: myBoxDecoration(ivory),
|
|
|
|
padding: EdgeInsets.all(5.0),
|
|
|
|
child: Column(
|
|
|
|
children: createForeCast(foreCastJson['list']),
|
|
|
|
),
|
|
|
|
);
|
2019-07-27 15:34:01 -07:00
|
|
|
} catch (e) {
|
2019-06-27 17:29:40 -07:00
|
|
|
return Container(
|
|
|
|
margin: EdgeInsets.symmetric(
|
2019-07-27 15:34:01 -07:00
|
|
|
vertical: 3,
|
|
|
|
horizontal: 6,
|
2019-06-27 17:29:40 -07:00
|
|
|
),
|
|
|
|
padding: myBoxPadding,
|
|
|
|
decoration: myBoxDecoration(ivory),
|
|
|
|
child: Wrap(
|
|
|
|
spacing: 20.0,
|
|
|
|
children: <Widget>[
|
|
|
|
Text(
|
|
|
|
'Pending...',
|
|
|
|
style: TextStyle(height: textHeight),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
double getinHg(double mBar) {
|
|
|
|
return (mBar != null) ? ((mBar * 29.53).round() / 1000.0) : null;
|
|
|
|
}
|
|
|
|
|
|
|
|
double getmmHg(double mBar) {
|
|
|
|
return (mBar != null) ? ((mBar * 75.0062).round() / 100.0) : null;
|
|
|
|
}
|
|
|
|
|
|
|
|
int getKnots(double miles) {
|
|
|
|
return (miles != null) ? (miles * 0.8689).round() : null;
|
|
|
|
}
|
|
|
|
|
|
|
|
int getKilometers(double miles) {
|
|
|
|
return (miles != null) ? (miles * 1.60934).round() : null;
|
|
|
|
}
|
|
|
|
|
|
|
|
int getCelcius(double fahrenheit) {
|
|
|
|
return (fahrenheit != null) ? (((fahrenheit - 32) * 5) / 9).round() : null;
|
|
|
|
}
|
|
|
|
|
|
|
|
Map<String, String> get3WayTime(int secondsFromEpoch, int timeOffSet) {
|
|
|
|
DateTime utcTime =
|
|
|
|
DateTime.fromMillisecondsSinceEpoch(secondsFromEpoch * 1000).toUtc();
|
|
|
|
DateTime thereTime = utcTime.add(Duration(minutes: timeOffSet));
|
|
|
|
DateTime hereTime = utcTime.toLocal();
|
2019-07-27 15:34:01 -07:00
|
|
|
String there = (timeOffSet != 2000)
|
|
|
|
? DateFormat('EEEE MMMM d, HH:mm').format(thereTime)
|
|
|
|
: 'UNKNOWN, INVALID';
|
2019-06-27 17:29:40 -07:00
|
|
|
String here = DateFormat('EEEE MMMM d, HH:mm').format(hereTime);
|
|
|
|
String utc = DateFormat('EEEE MMMM d, HH:mm').format(utcTime);
|
|
|
|
return {
|
|
|
|
'There': there,
|
|
|
|
'Here': here,
|
|
|
|
'UTC': utc,
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
String getDirection(int direction) {
|
|
|
|
if ((direction < 22.5) || (direction >= 337.5)) {
|
|
|
|
return "N";
|
|
|
|
} else if ((direction >= 22.5) && (direction < 67.5)) {
|
|
|
|
return "NE";
|
|
|
|
} else if ((direction >= 67.5) && (direction < 112.5)) {
|
|
|
|
return "E";
|
|
|
|
} else if ((direction >= 112.5) && (direction < 157.5)) {
|
|
|
|
return "SE";
|
|
|
|
} else if ((direction >= 157.5) && (direction < 202.5)) {
|
|
|
|
return "S";
|
|
|
|
} else if ((direction >= 202.5) && (direction < 247.5)) {
|
|
|
|
return "SW";
|
|
|
|
} else if ((direction >= 247.5) && (direction < 292.5)) {
|
|
|
|
return "W";
|
|
|
|
} else if ((direction >= 292.5) && (direction < 337.5)) {
|
|
|
|
return "NW";
|
|
|
|
}
|
|
|
|
return "none";
|
|
|
|
}
|
|
|
|
}
|