Skip to content

Commit a4cd020

Browse files
committed
refactor code to reduce widget nest in weather widget
1 parent f87fd76 commit a4cd020

File tree

4 files changed

+92
-67
lines changed

4 files changed

+92
-67
lines changed

lib/src/widgets/line_chart.dart

Lines changed: 0 additions & 21 deletions
This file was deleted.
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import 'package:charts_flutter/flutter.dart' as charts;
2+
import 'package:flutter/material.dart';
3+
import 'package:flutter_weather/main.dart';
4+
import 'package:flutter_weather/src/model/weather.dart';
5+
6+
class TemperatureLineChart extends StatelessWidget {
7+
8+
final List<Weather> weathers;
9+
final bool animate;
10+
11+
TemperatureLineChart(this.weathers, {this.animate});
12+
13+
@override
14+
Widget build(BuildContext context) {
15+
return Padding(
16+
padding: const EdgeInsets.all(40.0),
17+
child: charts.TimeSeriesChart([
18+
new charts.Series<Weather, DateTime>(
19+
id: 'Temperature',
20+
colorFn: (_, __) =>
21+
charts.MaterialPalette.blue.shadeDefault,
22+
domainFn: (Weather weather, _) =>
23+
DateTime.fromMillisecondsSinceEpoch(
24+
weather.time * 1000),
25+
measureFn: (Weather weather, _) =>
26+
weather.temperature.as(AppStateContainer.of(context).temperatureUnit),
27+
data: weathers,
28+
)
29+
],
30+
animate: animate,
31+
animationDuration: Duration(milliseconds: 500),
32+
primaryMeasureAxis: new charts.NumericAxisSpec(
33+
tickProviderSpec: new charts.BasicNumericTickProviderSpec(
34+
zeroBound: false))));
35+
}
36+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import 'package:flutter/material.dart';
2+
import 'package:flutter_swiper/flutter_swiper.dart';
3+
import 'package:flutter_weather/main.dart';
4+
import 'package:flutter_weather/src/model/weather.dart';
5+
import 'package:flutter_weather/src/widgets/current_conditions.dart';
6+
import 'package:flutter_weather/src/widgets/empty_widget.dart';
7+
import 'package:flutter_weather/src/widgets/temperature_line_chart.dart';
8+
9+
10+
class WeatherSwipePager extends StatelessWidget {
11+
const WeatherSwipePager({
12+
Key key,
13+
@required this.weather,
14+
}) : super(key: key);
15+
16+
final Weather weather;
17+
18+
@override
19+
Widget build(BuildContext context) {
20+
return Container(
21+
width: MediaQuery.of(context).size.width,
22+
height: 300,
23+
child: Swiper(
24+
itemCount: 2,
25+
index: 0,
26+
itemBuilder: (context, index) {
27+
if (index == 0) {
28+
return CurrentConditions(
29+
weather: weather,
30+
);
31+
} else if (index == 1) {
32+
return TemperatureLineChart(
33+
weather.forecast,
34+
animate: true,
35+
);
36+
}
37+
return EmptyWidget();
38+
},
39+
pagination: new SwiperPagination(
40+
margin: new EdgeInsets.all(5.0),
41+
builder: new DotSwiperPaginationBuilder(
42+
size: 5,
43+
activeSize: 5,
44+
color: AppStateContainer.of(context)
45+
.theme
46+
.accentColor
47+
.withOpacity(0.4),
48+
activeColor:
49+
AppStateContainer.of(context).theme.accentColor)),
50+
),
51+
);
52+
}
53+
}

lib/src/widgets/weather_widget.dart

Lines changed: 3 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,15 @@
11
import 'package:flutter/material.dart';
22
import 'package:flutter_weather/main.dart';
33
import 'package:flutter_weather/src/model/weather.dart';
4-
import 'package:flutter_weather/src/widgets/current_conditions.dart';
5-
import 'package:flutter_weather/src/widgets/empty_widget.dart';
64
import 'package:flutter_weather/src/widgets/forecast_horizontal_widget.dart';
7-
import 'package:flutter_weather/src/widgets/line_chart.dart';
85
import 'package:flutter_weather/src/widgets/value_tile.dart';
6+
import 'package:flutter_weather/src/widgets/weather_swipe_pager.dart';
97
import 'package:intl/intl.dart';
10-
import 'package:flutter_swiper/flutter_swiper.dart';
11-
import 'package:charts_flutter/flutter.dart' as charts;
128

139
class WeatherWidget extends StatelessWidget {
1410
final Weather weather;
15-
final temperatureData;
1611

17-
WeatherWidget({this.weather})
18-
: temperatureData = [
19-
new charts.Series<Weather, DateTime>(
20-
id: 'Temperature',
21-
colorFn: (_, __) => charts.MaterialPalette.blue.shadeDefault,
22-
domainFn: (Weather weather, _) =>
23-
DateTime.fromMillisecondsSinceEpoch(weather.time * 1000),
24-
measureFn: (Weather weather, _) => weather.temperature.celsius,
25-
data: weather.forecast,
26-
)
27-
];
12+
WeatherWidget({this.weather}) : assert(weather != null);
2813

2914
@override
3015
Widget build(BuildContext context) {
@@ -51,35 +36,7 @@ class WeatherWidget extends StatelessWidget {
5136
fontSize: 15,
5237
color: AppStateContainer.of(context).theme.accentColor),
5338
),
54-
Container(
55-
width: MediaQuery.of(context).size.width,
56-
height: 300,
57-
child: Swiper(
58-
itemCount: 2,
59-
index: 0,
60-
itemBuilder: (context, index) {
61-
if (index == 0) {
62-
return CurrentConditions(
63-
weather: weather,
64-
);
65-
} else if (index == 1) {
66-
return PointsLineChart(temperatureData, animate: true,);
67-
}
68-
return EmptyWidget();
69-
},
70-
pagination: new SwiperPagination(
71-
margin: new EdgeInsets.all(5.0),
72-
builder: new DotSwiperPaginationBuilder(
73-
size: 5,
74-
activeSize: 5,
75-
color: AppStateContainer.of(context)
76-
.theme
77-
.accentColor
78-
.withOpacity(0.4),
79-
activeColor:
80-
AppStateContainer.of(context).theme.accentColor)),
81-
),
82-
),
39+
WeatherSwipePager(weather: weather),
8340
Padding(
8441
child: Divider(
8542
color:

0 commit comments

Comments
 (0)