From d134345f8c465d26e0d2011d023706dac7a5d6ff Mon Sep 17 00:00:00 2001 From: Taha Tesser Date: Thu, 28 Sep 2023 19:06:53 +0300 Subject: [PATCH] Fix `RangeSlider` throws an exception in a `ListView` (#135667) fixes [[RangeSlider] [Flutter 3.10] LateInitializationError: Field '_startThumbCenter@280317193' has not been initialized.](https://github.com/flutter/flutter/issues/126648) ### Code sample (Run it on iOS)
expand to view the code sample ```dart import 'package:flutter/material.dart'; void main() => runApp(const MyApp()); class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return const MaterialApp( debugShowCheckedModeBanner: false, home: Example(), ); } } class Example extends StatelessWidget { const Example({super.key}); @override Widget build(BuildContext context) { return Scaffold( body: ListView( children: [ const SizedBox( height: 1000, child: Placeholder(), ), RangeSlider( values: const RangeValues(0.25, 0.75), onChanged: (value) {}, ), ], ), ); } } ```
--- .../lib/src/material/range_slider.dart | 4 +-- .../test/material/range_slider_test.dart | 32 ++++++++++++++++++- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/packages/flutter/lib/src/material/range_slider.dart b/packages/flutter/lib/src/material/range_slider.dart index af73161d2a4d..d8bb4961f114 100644 --- a/packages/flutter/lib/src/material/range_slider.dart +++ b/packages/flutter/lib/src/material/range_slider.dart @@ -900,8 +900,8 @@ class _RenderRangeSlider extends RenderBox with RelayoutWhenSystemFontsChangeMix late TapGestureRecognizer _tap; bool _active = false; late RangeValues _newValues; - late Offset _startThumbCenter; - late Offset _endThumbCenter; + Offset _startThumbCenter = Offset.zero; + Offset _endThumbCenter = Offset.zero; Rect? overlayStartRect; Rect? overlayEndRect; diff --git a/packages/flutter/test/material/range_slider_test.dart b/packages/flutter/test/material/range_slider_test.dart index 5bedc0cad01a..bd1c52806523 100644 --- a/packages/flutter/test/material/range_slider_test.dart +++ b/packages/flutter/test/material/range_slider_test.dart @@ -2541,7 +2541,7 @@ void main() { ); }); - testWidgetsWithLeakTracking('RangeSlider onChangeStart and onChangeEnd fire once', (WidgetTester tester) async { + testWidgetsWithLeakTracking('RangeSlider onChangeStart and onChangeEnd fire once', (WidgetTester tester) async { // Regression test for https://github.com/flutter/flutter/issues/128433 int startFired = 0; @@ -2581,4 +2581,34 @@ void main() { expect(startFired, equals(1)); expect(endFired, equals(1)); }); + + testWidgetsWithLeakTracking('RangeSlider in a ListView does not throw an exception', (WidgetTester tester) async { + // Regression test for https://github.com/flutter/flutter/issues/126648 + + await tester.pumpWidget( + MaterialApp( + home: Directionality( + textDirection: TextDirection.ltr, + child: Material( + child: ListView( + children: [ + const SizedBox( + height: 600, + child: Placeholder(), + ), + RangeSlider( + values: const RangeValues(40, 80), + max: 100, + onChanged: (RangeValues newValue) { }, + ), + ], + ), + ), + ), + ), + ); + + // No exception should be thrown. + expect(tester.takeException(), null); + }); }