Skip to content

Commit cef737c

Browse files
authored
_YearPicker should dispose ScrollController and MaterialSatesController. (#134393)
1 parent 7d0c9b7 commit cef737c

File tree

3 files changed

+15
-7
lines changed

3 files changed

+15
-7
lines changed

packages/flutter/lib/src/material/calendar_date_picker.dart

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1147,7 +1147,8 @@ class YearPicker extends StatefulWidget {
11471147
}
11481148

11491149
class _YearPickerState extends State<YearPicker> {
1150-
late ScrollController _scrollController;
1150+
ScrollController? _scrollController;
1151+
final MaterialStatesController _statesController = MaterialStatesController();
11511152

11521153
// The approximate number of years necessary to fill the available space.
11531154
static const int minYears = 18;
@@ -1158,11 +1159,18 @@ class _YearPickerState extends State<YearPicker> {
11581159
_scrollController = ScrollController(initialScrollOffset: _scrollOffsetForYear(widget.selectedDate ?? widget.firstDate));
11591160
}
11601161

1162+
@override
1163+
void dispose() {
1164+
_scrollController?.dispose();
1165+
_statesController.dispose();
1166+
super.dispose();
1167+
}
1168+
11611169
@override
11621170
void didUpdateWidget(YearPicker oldWidget) {
11631171
super.didUpdateWidget(oldWidget);
11641172
if (widget.selectedDate != oldWidget.selectedDate && widget.selectedDate != null) {
1165-
_scrollController.jumpTo(_scrollOffsetForYear(widget.selectedDate!));
1173+
_scrollController!.jumpTo(_scrollOffsetForYear(widget.selectedDate!));
11661174
}
11671175
}
11681176

@@ -1255,10 +1263,11 @@ class _YearPickerState extends State<YearPicker> {
12551263
assert(date.year == widget.lastDate.year);
12561264
date = DateTime(year, widget.lastDate.month);
12571265
}
1266+
_statesController.value = states;
12581267
yearItem = InkWell(
12591268
key: ValueKey<int>(year),
12601269
onTap: () => widget.onChanged(date),
1261-
statesController: MaterialStatesController(states),
1270+
statesController: _statesController,
12621271
overlayColor: overlayColor,
12631272
child: yearItem,
12641273
);

packages/flutter/lib/src/widgets/scroll_controller.dart

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,6 @@ typedef ScrollControllerCallback = void Function(ScrollPosition position);
5757
/// listen to scrolling occur without using a [ScrollController].
5858
class ScrollController extends ChangeNotifier {
5959
/// Creates a controller for a scrollable widget.
60-
///
61-
/// The values of `initialScrollOffset` and `keepScrollOffset` must not be null.
6260
ScrollController({
6361
double initialScrollOffset = 0.0,
6462
this.keepScrollOffset = true,

packages/flutter/test/material/calendar_date_picker_test.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import 'package:flutter/material.dart';
66
import 'package:flutter/services.dart';
77
import 'package:flutter_test/flutter_test.dart';
8+
import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart';
89

910
import 'feedback_tester.dart';
1011

@@ -211,7 +212,7 @@ void main() {
211212
expect(selectedDate, equals(DateTime(2018, DateTime.january, 4)));
212213
});
213214

214-
testWidgets('Changing year for february 29th', (WidgetTester tester) async {
215+
testWidgetsWithLeakTracking('Changing year for february 29th', (WidgetTester tester) async {
215216
DateTime? selectedDate;
216217
await tester.pumpWidget(calendarDatePicker(
217218
initialDate: DateTime(2020, DateTime.february, 29),
@@ -230,7 +231,7 @@ void main() {
230231
expect(selectedDate, equals(DateTime(2020, DateTime.february, 28)));
231232
});
232233

233-
testWidgets('Changing year does not change the month', (WidgetTester tester) async {
234+
testWidgetsWithLeakTracking('Changing year does not change the month', (WidgetTester tester) async {
234235
DateTime? displayedMonth;
235236
await tester.pumpWidget(calendarDatePicker(
236237
initialDate: DateTime(2016, DateTime.january, 15),

0 commit comments

Comments
 (0)