Skip to content

Commit 3a1030f

Browse files
committed
feat: refactor DailyCard to use StatefulWidget for improved state management closes #704
1 parent d58fe75 commit 3a1030f

1 file changed

Lines changed: 54 additions & 27 deletions

File tree

lib/widgets/daily_card.dart

Lines changed: 54 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import 'package:material_symbols_icons/material_symbols_icons.dart';
99
import '../screens/daily_forecast.dart';
1010
import '../controllers/home_f.dart';
1111

12-
class DailyCard extends StatelessWidget {
12+
class DailyCard extends StatefulWidget {
1313
final List<dynamic> dailyTime;
1414
final List<dynamic> dailyTempsMin;
1515
final List<dynamic> dailyWeatherCodes;
@@ -18,15 +18,39 @@ class DailyCard extends StatelessWidget {
1818
final int selectedContainerBgIndex;
1919
final String utcOffsetSeconds;
2020

21-
DailyCard(
22-
{super.key,
23-
required this.dailyTime,
24-
required this.dailyTempsMin,
25-
required this.dailyWeatherCodes,
26-
required this.dailyTempsMax,
27-
required this.dailyPrecProb,
28-
required this.utcOffsetSeconds,
29-
required this.selectedContainerBgIndex});
21+
DailyCard({
22+
super.key,
23+
required this.dailyTime,
24+
required this.dailyTempsMin,
25+
required this.dailyWeatherCodes,
26+
required this.dailyTempsMax,
27+
required this.dailyPrecProb,
28+
required this.utcOffsetSeconds,
29+
required this.selectedContainerBgIndex,
30+
});
31+
32+
@override
33+
DailyCardState createState() => DailyCardState();
34+
}
35+
36+
class DailyCardState extends State<DailyCard> {
37+
late final ScrollController _scrollController;
38+
39+
@override
40+
void initState() {
41+
super.initState();
42+
_scrollController = ScrollController();
43+
44+
WidgetsBinding.instance.addPostFrameCallback((_) {
45+
_scrollController.jumpTo(68 + 5);
46+
});
47+
}
48+
49+
@override
50+
void dispose() {
51+
_scrollController.dispose();
52+
super.dispose();
53+
}
3054

3155
@override
3256
Widget build(BuildContext context) {
@@ -42,21 +66,22 @@ class DailyCard extends StatelessWidget {
4266

4367
final List<Map<String, dynamic>> validDailyData = [];
4468

45-
for (int i = 0; i < dailyTime.length; i++) {
46-
if (i < dailyTempsMin.length &&
47-
i < dailyTempsMax.length &&
48-
i < dailyWeatherCodes.length &&
49-
i < dailyPrecProb.length &&
50-
dailyTime[i] != null &&
51-
dailyTempsMin[i] != null &&
52-
dailyTempsMax[i] != null &&
53-
dailyWeatherCodes[i] != null) {
69+
for (int i = 0; i < widget.dailyTime.length; i++) {
70+
if (i < widget.dailyTempsMin.length &&
71+
i < widget.dailyTempsMax.length &&
72+
i < widget.dailyWeatherCodes.length &&
73+
i < widget.dailyPrecProb.length &&
74+
widget.dailyTime[i] != null &&
75+
widget.dailyTempsMin[i] != null &&
76+
widget.dailyTempsMax[i] != null &&
77+
widget.dailyWeatherCodes[i] != null) {
5478
validDailyData.add({
55-
"time": dailyTime[i],
56-
"tempMin": dailyTempsMin[i],
57-
"tempMax": dailyTempsMax[i],
58-
"weatherCode": dailyWeatherCodes[i],
59-
"precipProb": (dailyPrecProb[i] as num?)?.toDouble() ?? 0.0000001,
79+
"time": widget.dailyTime[i],
80+
"tempMin": widget.dailyTempsMin[i],
81+
"tempMax": widget.dailyTempsMax[i],
82+
"weatherCode": widget.dailyWeatherCodes[i],
83+
"precipProb":
84+
(widget.dailyPrecProb[i] as num?)?.toDouble() ?? 0.0000001,
6085
});
6186
}
6287
}
@@ -66,7 +91,7 @@ class DailyCard extends StatelessWidget {
6691
child: Material(
6792
elevation: 1,
6893
borderRadius: BorderRadius.circular(20),
69-
color: Color(selectedContainerBgIndex),
94+
color: Color(widget.selectedContainerBgIndex),
7095
child: Container(
7196
padding: EdgeInsets.only(top: 15, bottom: 0),
7297
child: Column(
@@ -98,6 +123,7 @@ class DailyCard extends StatelessWidget {
98123
SizedBox(
99124
height: 213,
100125
child: ListView.separated(
126+
controller: _scrollController,
101127
scrollDirection: Axis.horizontal,
102128
physics: BouncingScrollPhysics(),
103129
itemCount: validDailyData.length,
@@ -114,7 +140,7 @@ class DailyCard extends StatelessWidget {
114140
EdgeInsetsDirectional itemMargin =
115141
EdgeInsetsDirectional.only(
116142
start: index == 0 ? 15 : 0,
117-
end: index == dailyTime.length - 1 ? 15 : 0,
143+
end: index == widget.dailyTime.length - 1 ? 15 : 0,
118144
);
119145

120146
return RepaintBoundary(
@@ -191,7 +217,8 @@ class DailyCard extends StatelessWidget {
191217
height: 3,
192218
),
193219
Text(
194-
getDayLabel(time, index, utcOffsetSeconds)
220+
getDayLabel(time, index,
221+
widget.utcOffsetSeconds)
195222
.toLowerCase()
196223
.tr(),
197224
style: const TextStyle(

0 commit comments

Comments
 (0)