// Copyright 2014 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; void main() { test('Can dispose ScrollPosition when hasPixels is false', () { final ScrollPosition position = ScrollPositionWithSingleContext( initialPixels: null, keepScrollOffset: false, physics: const AlwaysScrollableScrollPhysics(), context: ScrollableState(), ); expect(position.hasPixels, false); position.dispose(); // Should not throw/assert. }); testWidgets('scrollable in hidden overlay does not crash when unhidden', (WidgetTester tester) async { // Regression test for https://github.com/flutter/flutter/issues/44269. final TabController controller = TabController(vsync: const TestVSync(), length: 1); final OverlayEntry entry1 = OverlayEntry( maintainState: true, opaque: true, builder: (BuildContext context) { return TabBar( isScrollable: true, controller: controller, tabs: const <Tab>[ Tab(text: 'Main'), ], ); }, ); final OverlayEntry entry2 = OverlayEntry( maintainState: true, opaque: true, builder: (BuildContext context) { return const Text('number2'); }, ); await tester.pumpWidget( MaterialApp( home: Material( child: Overlay( initialEntries: <OverlayEntry>[ entry1, entry2, ], ), ), ), ); entry2.remove(); await tester.pump(); expect(tester.takeException(), isNull); }); }