Unverified Commit 9fee27b2 authored by Polina Cherkasova's avatar Polina Cherkasova Committed by GitHub
parent e10049b2
...@@ -3263,6 +3263,12 @@ class _MenuPanel extends StatefulWidget { ...@@ -3263,6 +3263,12 @@ class _MenuPanel extends StatefulWidget {
class _MenuPanelState extends State<_MenuPanel> { class _MenuPanelState extends State<_MenuPanel> {
ScrollController scrollController = ScrollController(); ScrollController scrollController = ScrollController();
@override
void dispose() {
scrollController.dispose();
super.dispose();
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final (MenuStyle? themeStyle, MenuStyle defaultStyle) = switch (widget.orientation) { final (MenuStyle? themeStyle, MenuStyle defaultStyle) = switch (widget.orientation) {
......
...@@ -1410,18 +1410,23 @@ class _TabBarState extends State<TabBar> { ...@@ -1410,18 +1410,23 @@ class _TabBarState extends State<TabBar> {
?? tabBarTheme.indicatorSize ?? tabBarTheme.indicatorSize
?? _defaults.indicatorSize!; ?? _defaults.indicatorSize!;
final _IndicatorPainter? oldPainter = _indicatorPainter;
_indicatorPainter = !_controllerIsValid ? null : _IndicatorPainter( _indicatorPainter = !_controllerIsValid ? null : _IndicatorPainter(
controller: _controller!, controller: _controller!,
indicator: _getIndicator(indicatorSize), indicator: _getIndicator(indicatorSize),
indicatorSize: indicatorSize, indicatorSize: indicatorSize,
indicatorPadding: widget.indicatorPadding, indicatorPadding: widget.indicatorPadding,
tabKeys: _tabKeys, tabKeys: _tabKeys,
old: _indicatorPainter, // Passing old painter so that the constructor can copy some values from it.
old: oldPainter,
labelPaddings: _labelPaddings, labelPaddings: _labelPaddings,
dividerColor: widget.dividerColor ?? tabBarTheme.dividerColor ?? _defaults.dividerColor, dividerColor: widget.dividerColor ?? tabBarTheme.dividerColor ?? _defaults.dividerColor,
dividerHeight: widget.dividerHeight ?? tabBarTheme.dividerHeight ?? _defaults.dividerHeight, dividerHeight: widget.dividerHeight ?? tabBarTheme.dividerHeight ?? _defaults.dividerHeight,
showDivider: theme.useMaterial3 && !widget.isScrollable, showDivider: theme.useMaterial3 && !widget.isScrollable,
); );
oldPainter?.dispose();
} }
@override @override
......
...@@ -9,6 +9,7 @@ library; ...@@ -9,6 +9,7 @@ library;
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart';
void main() { void main() {
/* /*
...@@ -77,7 +78,10 @@ void main() { ...@@ -77,7 +78,10 @@ void main() {
// Currently skipped due to daily flake: https://github.com/flutter/flutter/issues/87588 // Currently skipped due to daily flake: https://github.com/flutter/flutter/issues/87588
}, skip: true); // Typically skip: isBrowser https://github.com/flutter/flutter/issues/42767 }, skip: true); // Typically skip: isBrowser https://github.com/flutter/flutter/issues/42767
testWidgets('Should show event indicator for pointer events with setSurfaceSize', (WidgetTester tester) async { testWidgets('Should show event indicator for pointer events with setSurfaceSize',
// TODO(polina-c): clean up leaks, https://github.com/flutter/flutter/issues/134787 [leaks-to-clean]
experimentalLeakTesting: LeakTesting.settings.withIgnoredAll(),
(WidgetTester tester) async {
final AnimationSheetBuilder animationSheet = AnimationSheetBuilder(frameSize: const Size(200, 200), allLayers: true); final AnimationSheetBuilder animationSheet = AnimationSheetBuilder(frameSize: const Size(200, 200), allLayers: true);
addTearDown(animationSheet.dispose); addTearDown(animationSheet.dispose);
final List<Offset> taps = <Offset>[]; final List<Offset> taps = <Offset>[];
......
...@@ -7,12 +7,16 @@ import 'dart:typed_data'; ...@@ -7,12 +7,16 @@ import 'dart:typed_data';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart';
import '../../image_data.dart'; import '../../image_data.dart';
late List<int> selectedTabs; late List<int> selectedTabs;
void main() { void main() {
// TODO(polina-c): dispose ImageStreamCompleterHandle, https://github.com/flutter/flutter/issues/145599 [leaks-to-clean]
LeakTesting.settings = LeakTesting.settings.withIgnoredAll();
setUp(() { setUp(() {
selectedTabs = <int>[]; selectedTabs = <int>[];
}); });
......
...@@ -6,6 +6,7 @@ import 'package:flutter/cupertino.dart'; ...@@ -6,6 +6,7 @@ import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart';
import '../image_data.dart'; import '../image_data.dart';
import '../rendering/rendering_tester.dart' show TestCallbackPainter; import '../rendering/rendering_tester.dart' show TestCallbackPainter;
...@@ -39,6 +40,9 @@ class MockCupertinoTabController extends CupertinoTabController { ...@@ -39,6 +40,9 @@ class MockCupertinoTabController extends CupertinoTabController {
} }
void main() { void main() {
// TODO(polina-c): dispose ImageStreamCompleterHandle, https://github.com/flutter/flutter/issues/145599 [leaks-to-clean]
LeakTesting.settings = LeakTesting.settings.withIgnoredAll();
setUp(() { setUp(() {
selectedTabs = <int>[]; selectedTabs = <int>[];
}); });
...@@ -244,7 +248,9 @@ void main() { ...@@ -244,7 +248,9 @@ void main() {
); );
}); });
testWidgets('Programmatic tab switching by changing the index of an existing controller', (WidgetTester tester) async { testWidgets('Programmatic tab switching by changing the index of an existing controller',
experimentalLeakTesting: LeakTesting.settings.withCreationStackTrace(),
(WidgetTester tester) async {
final CupertinoTabController controller = CupertinoTabController(initialIndex: 1); final CupertinoTabController controller = CupertinoTabController(initialIndex: 1);
addTearDown(controller.dispose); addTearDown(controller.dispose);
final List<int> tabsPainted = <int>[]; final List<int> tabsPainted = <int>[];
...@@ -825,6 +831,8 @@ void main() { ...@@ -825,6 +831,8 @@ void main() {
testWidgets('A controller can control more than one CupertinoTabScaffold, ' testWidgets('A controller can control more than one CupertinoTabScaffold, '
'removal of listeners does not break the controller', 'removal of listeners does not break the controller',
// TODO(polina-c): dispose TabController, https://github.com/flutter/flutter/issues/144910 [leaks-to-clean]
experimentalLeakTesting: LeakTesting.settings.withIgnoredAll(),
(WidgetTester tester) async { (WidgetTester tester) async {
final List<int> tabsPainted0 = <int>[]; final List<int> tabsPainted0 = <int>[];
final List<int> tabsPainted1 = <int>[]; final List<int> tabsPainted1 = <int>[];
...@@ -1094,7 +1102,9 @@ void main() { ...@@ -1094,7 +1102,9 @@ void main() {
expect(find.text("don't lose me"), findsOneWidget); expect(find.text("don't lose me"), findsOneWidget);
}); });
testWidgets('textScaleFactor is set to 1.0', (WidgetTester tester) async { testWidgets('textScaleFactor is set to 1.0',
experimentalLeakTesting: LeakTesting.settings.withCreationStackTrace(),
(WidgetTester tester) async {
await tester.pumpWidget( await tester.pumpWidget(
CupertinoApp( CupertinoApp(
home: Builder(builder: (BuildContext context) { home: Builder(builder: (BuildContext context) {
...@@ -1267,7 +1277,10 @@ void main() { ...@@ -1267,7 +1277,10 @@ void main() {
.setMockMethodCallHandler(SystemChannels.platform, null); .setMockMethodCallHandler(SystemChannels.platform, null);
}); });
testWidgets('System back navigation inside of tabs', (WidgetTester tester) async { testWidgets('System back navigation inside of tabs',
// TODO(polina-c): dispose TabController, https://github.com/flutter/flutter/issues/144910
experimentalLeakTesting: LeakTesting.settings.withIgnoredAll(),
(WidgetTester tester) async {
await tester.pumpWidget( await tester.pumpWidget(
CupertinoApp( CupertinoApp(
home: MediaQuery( home: MediaQuery(
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart';
void main() { void main() {
testWidgets('Use home', (WidgetTester tester) async { testWidgets('Use home', (WidgetTester tester) async {
...@@ -81,7 +82,9 @@ void main() { ...@@ -81,7 +82,9 @@ void main() {
expect(find.text('generated home'), findsOneWidget); expect(find.text('generated home'), findsOneWidget);
}); });
testWidgets('Use onUnknownRoute', (WidgetTester tester) async { testWidgets('Use onUnknownRoute',
experimentalLeakTesting: LeakTesting.settings.withIgnoredAll(), // leaking by design because of exception
(WidgetTester tester) async {
late String unknownForRouteCalled; late String unknownForRouteCalled;
await tester.pumpWidget( await tester.pumpWidget(
CupertinoApp( CupertinoApp(
......
...@@ -49,6 +49,12 @@ Future<void> testExecutable(FutureOr<void> Function() testMain) { ...@@ -49,6 +49,12 @@ Future<void> testExecutable(FutureOr<void> Function() testMain) {
LeakTesting.settings = LeakTesting.settings.withIgnored( LeakTesting.settings = LeakTesting.settings.withIgnored(
createdByTestHelpers: true, createdByTestHelpers: true,
allNotGCed: true, allNotGCed: true,
classes: <String>[
// TODO(polina-c): CurvedAnimation is leaking, https://github.com/flutter/flutter/issues/145600 [leaks-to-clean]
'CurvedAnimation',
// TODO(polina-c): _NullElement is leaking, https://github.com/flutter/flutter/issues/145602 [leaks-to-clean]
'_NullElement',
],
); );
} }
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
import 'package:flutter/gestures.dart'; import 'package:flutter/gestures.dart';
import 'package:flutter/scheduler.dart'; import 'package:flutter/scheduler.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart';
import 'gesture_tester.dart'; import 'gesture_tester.dart';
...@@ -764,7 +765,10 @@ void main() { ...@@ -764,7 +765,10 @@ void main() {
]); ]);
}); });
testGesture('Horizontal drag with multiple pointers - averageBoundaryPointers', (GestureTester tester) { testGesture('Horizontal drag with multiple pointers - averageBoundaryPointers',
// TODO(polina-c): dispose gesture recognizers https://github.com/flutter/flutter/issues/145605 [leaks-to-clean]
experimentalLeakTesting: LeakTesting.settings.withIgnoredAll(),
(GestureTester tester) {
final HorizontalDragGestureRecognizer drag = final HorizontalDragGestureRecognizer drag =
HorizontalDragGestureRecognizer() HorizontalDragGestureRecognizer()
..multitouchDragStrategy = MultitouchDragStrategy.averageBoundaryPointers; ..multitouchDragStrategy = MultitouchDragStrategy.averageBoundaryPointers;
...@@ -924,7 +928,10 @@ void main() { ...@@ -924,7 +928,10 @@ void main() {
]); ]);
}); });
testGesture('Vertical drag with multiple pointers - averageBoundaryPointers', (GestureTester tester) { testGesture('Vertical drag with multiple pointers - averageBoundaryPointers',
// TODO(polina-c): dispose gesture recognizers https://github.com/flutter/flutter/issues/145605 [leaks-to-clean]
experimentalLeakTesting: LeakTesting.settings.withIgnoredAll(),
(GestureTester tester) {
final VerticalDragGestureRecognizer drag = final VerticalDragGestureRecognizer drag =
VerticalDragGestureRecognizer() VerticalDragGestureRecognizer()
..multitouchDragStrategy = MultitouchDragStrategy.averageBoundaryPointers; ..multitouchDragStrategy = MultitouchDragStrategy.averageBoundaryPointers;
...@@ -1084,7 +1091,10 @@ void main() { ...@@ -1084,7 +1091,10 @@ void main() {
]); ]);
}); });
testGesture('Pan drag with multiple pointers - averageBoundaryPointers', (GestureTester tester) { testGesture('Pan drag with multiple pointers - averageBoundaryPointers',
// TODO(polina-c): dispose gesture recognizers https://github.com/flutter/flutter/issues/145605 [leaks-to-clean]
experimentalLeakTesting: LeakTesting.settings.withIgnoredAll(),
(GestureTester tester) {
final PanGestureRecognizer drag = final PanGestureRecognizer drag =
PanGestureRecognizer() PanGestureRecognizer()
..multitouchDragStrategy = MultitouchDragStrategy.averageBoundaryPointers; ..multitouchDragStrategy = MultitouchDragStrategy.averageBoundaryPointers;
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
import 'package:fake_async/fake_async.dart'; import 'package:fake_async/fake_async.dart';
import 'package:flutter/gestures.dart'; import 'package:flutter/gestures.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart';
import 'package:meta/meta.dart'; import 'package:meta/meta.dart';
class GestureTester { class GestureTester {
...@@ -25,10 +26,14 @@ class GestureTester { ...@@ -25,10 +26,14 @@ class GestureTester {
typedef GestureTest = void Function(GestureTester tester); typedef GestureTest = void Function(GestureTester tester);
@isTest @isTest
void testGesture(String description, GestureTest callback) { void testGesture(String description, GestureTest callback, {LeakTesting? experimentalLeakTesting}) {
testWidgets(description, (_) async { testWidgets(
FakeAsync().run((FakeAsync async) { description,
callback(GestureTester._(async)); (_) async {
}); FakeAsync().run((FakeAsync async) {
}); callback(GestureTester._(async));
});
},
experimentalLeakTesting: experimentalLeakTesting,
);
} }
...@@ -8,6 +8,7 @@ import 'package:flutter/material.dart'; ...@@ -8,6 +8,7 @@ import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart'; import 'package:flutter/rendering.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart';
class StateMarker extends StatefulWidget { class StateMarker extends StatefulWidget {
const StateMarker({ super.key, this.child }); const StateMarker({ super.key, this.child });
...@@ -369,7 +370,9 @@ void main() { ...@@ -369,7 +370,9 @@ void main() {
expect(find.text('route "/b"', skipOffstage: false), findsNothing); expect(find.text('route "/b"', skipOffstage: false), findsNothing);
}); });
testWidgets('onGenerateRoute / onUnknownRoute', (WidgetTester tester) async { testWidgets('onGenerateRoute / onUnknownRoute',
experimentalLeakTesting: LeakTesting.settings.withIgnoredAll(), // leaking by design because of exception
(WidgetTester tester) async {
final List<String> log = <String>[]; final List<String> log = <String>[];
await tester.pumpWidget( await tester.pumpWidget(
MaterialApp( MaterialApp(
......
...@@ -96,7 +96,7 @@ void main() { ...@@ -96,7 +96,7 @@ void main() {
}); });
testWidgets('CircleAvatar backgroundImage is used as a fallback for foregroundImage', testWidgets('CircleAvatar backgroundImage is used as a fallback for foregroundImage',
// TODO(polina-c): clean up leaks, https://github.com/flutter/flutter/issues/134787 [leaks-to-clean] // TODO(polina-c): make sure images are disposed, https://github.com/flutter/flutter/issues/141388 [leaks-to-clean]
experimentalLeakTesting: LeakTesting.settings.withIgnoredAll(), experimentalLeakTesting: LeakTesting.settings.withIgnoredAll(),
(WidgetTester tester) async { (WidgetTester tester) async {
final ErrorImageProvider errorImage = ErrorImageProvider(); final ErrorImageProvider errorImage = ErrorImageProvider();
......
...@@ -8,8 +8,12 @@ import 'package:flutter/material.dart'; ...@@ -8,8 +8,12 @@ import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart'; import 'package:flutter/rendering.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:leak_tracker_testing/leak_tracker_testing.dart';
void main() { void main() {
// TODO(polina-c): _DropdownMenuState should not be used after disposal, https://github.com/flutter/flutter/issues/145622 [leaks-to-clean]
LeakTesting.settings = LeakTesting.settings.withIgnoredAll();
const String longText = 'one two three four five six seven eight nine ten eleven twelve'; const String longText = 'one two three four five six seven eight nine ten eleven twelve';
final List<DropdownMenuEntry<TestMenu>> menuChildren = <DropdownMenuEntry<TestMenu>>[]; final List<DropdownMenuEntry<TestMenu>> menuChildren = <DropdownMenuEntry<TestMenu>>[];
...@@ -1800,8 +1804,7 @@ void main() { ...@@ -1800,8 +1804,7 @@ void main() {
checkExpectedHighlight(searchResult: 'Read', otherItems: <String>['All', 'Unread']); checkExpectedHighlight(searchResult: 'Read', otherItems: <String>['All', 'Unread']);
}); });
testWidgets('onSelected gets called when a selection is made in a nested menu', testWidgets('onSelected gets called when a selection is made in a nested menu', (WidgetTester tester) async {
(WidgetTester tester) async {
int selectionCount = 0; int selectionCount = 0;
final ThemeData themeData = ThemeData(); final ThemeData themeData = ThemeData();
......
...@@ -6,7 +6,6 @@ import 'package:flutter/foundation.dart'; ...@@ -6,7 +6,6 @@ import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
void main() { void main() {
Finder findMenuPanels() { Finder findMenuPanels() {
return find.byWidgetPredicate((Widget widget) => widget.runtimeType.toString() == '_MenuPanel'); return find.byWidgetPredicate((Widget widget) => widget.runtimeType.toString() == '_MenuPanel');
......
...@@ -2207,8 +2207,7 @@ void main() { ...@@ -2207,8 +2207,7 @@ void main() {
testWidgets( testWidgets(
'didUpdate bottomSheet while a previous bottom sheet is still displayed', 'didUpdate bottomSheet while a previous bottom sheet is still displayed',
// TODO(polina-c): clean up leaks, https://github.com/flutter/flutter/issues/134787 [leaks-to-clean] experimentalLeakTesting: LeakTesting.settings.withIgnoredAll(), // leaking by design because of exception
experimentalLeakTesting: LeakTesting.settings.withIgnoredAll(),
(WidgetTester tester) async { (WidgetTester tester) async {
final GlobalKey<ScaffoldState> key = GlobalKey<ScaffoldState>(); final GlobalKey<ScaffoldState> key = GlobalKey<ScaffoldState>();
const Key buttonKey = Key('button'); const Key buttonKey = Key('button');
......
...@@ -973,8 +973,7 @@ void main() { ...@@ -973,8 +973,7 @@ void main() {
}); });
testWidgets( testWidgets(
"TabBarTheme's labelColor & unselectedLabelColor override labelStyle & unselectedLabelStyle colors", "TabBarTheme's labelColor & unselectedLabelColor override labelStyle & unselectedLabelStyle colors", (WidgetTester tester) async {
(WidgetTester tester) async {
const Color labelColor = Color(0xfff00000); const Color labelColor = Color(0xfff00000);
const Color unselectedLabelColor = Color(0x95ff0000); const Color unselectedLabelColor = Color(0x95ff0000);
const TextStyle labelStyle = TextStyle( const TextStyle labelStyle = TextStyle(
......
...@@ -7,6 +7,7 @@ import 'package:flutter/material.dart'; ...@@ -7,6 +7,7 @@ import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart'; import 'package:flutter/rendering.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart';
import '../widgets/semantics_tester.dart'; import '../widgets/semantics_tester.dart';
import 'feedback_tester.dart'; import 'feedback_tester.dart';
...@@ -112,6 +113,9 @@ Widget buildLeftRightApp({required List<String> tabs, required String value, boo ...@@ -112,6 +113,9 @@ Widget buildLeftRightApp({required List<String> tabs, required String value, boo
} }
void main() { void main() {
// TODO(polina-c): dispose TabController, https://github.com/flutter/flutter/issues/144910 [leaks-to-clean]
LeakTesting.settings = LeakTesting.settings.withIgnoredAll();
setUp(() { setUp(() {
debugResetSemanticsIdCounter(); debugResetSemanticsIdCounter();
}); });
......
...@@ -10,7 +10,6 @@ import 'package:flutter/material.dart'; ...@@ -10,7 +10,6 @@ import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart'; import 'package:flutter/rendering.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart';
Future<void> verifyMarkedNeedsLayoutDuringTransientCallbacksPhase(WidgetTester tester, RenderObject renderObject) async { Future<void> verifyMarkedNeedsLayoutDuringTransientCallbacksPhase(WidgetTester tester, RenderObject renderObject) async {
assert(!renderObject.debugNeedsLayout); assert(!renderObject.debugNeedsLayout);
...@@ -37,9 +36,6 @@ Future<void> verifyMarkedNeedsLayoutDuringTransientCallbacksPhase(WidgetTester t ...@@ -37,9 +36,6 @@ Future<void> verifyMarkedNeedsLayoutDuringTransientCallbacksPhase(WidgetTester t
} }
void main() { void main() {
// TODO(polina-c): clean up leaks, https://github.com/flutter/flutter/issues/134787 [leaks-to-clean]
LeakTesting.settings = LeakTesting.settings.withIgnored(classes: <String>['CurvedAnimation']);
testWidgets('RenderParagraph relayout upon system fonts changes', (WidgetTester tester) async { testWidgets('RenderParagraph relayout upon system fonts changes', (WidgetTester tester) async {
await tester.pumpWidget( await tester.pumpWidget(
const MaterialApp( const MaterialApp(
......
...@@ -22,6 +22,7 @@ void main() { ...@@ -22,6 +22,7 @@ void main() {
group('RawImage', () { group('RawImage', () {
testWidgets('properties', (WidgetTester tester) async { testWidgets('properties', (WidgetTester tester) async {
final ui.Image image1 = (await tester.runAsync<ui.Image>(() => createTestImage()))!; final ui.Image image1 = (await tester.runAsync<ui.Image>(() => createTestImage()))!;
addTearDown(image1.dispose);
await tester.pumpWidget( await tester.pumpWidget(
Directionality( Directionality(
...@@ -50,6 +51,7 @@ void main() { ...@@ -50,6 +51,7 @@ void main() {
expect(renderObject.isAntiAlias, false); expect(renderObject.isAntiAlias, false);
final ui.Image image2 = (await tester.runAsync<ui.Image>(() => createTestImage(width: 2, height: 2)))!; final ui.Image image2 = (await tester.runAsync<ui.Image>(() => createTestImage(width: 2, height: 2)))!;
addTearDown(image2.dispose);
const String debugImageLabel = 'debugImageLabel'; const String debugImageLabel = 'debugImageLabel';
const double width = 1; const double width = 1;
const double height = 1; const double height = 1;
......
...@@ -5,9 +5,12 @@ ...@@ -5,9 +5,12 @@
import 'package:flutter/rendering.dart'; import 'package:flutter/rendering.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart';
void main() { void main() {
testWidgets('Sliver in a box', (WidgetTester tester) async { testWidgets('Sliver in a box',
experimentalLeakTesting: LeakTesting.settings.withIgnoredAll(), // leaking by design because of exception
(WidgetTester tester) async {
await tester.pumpWidget( await tester.pumpWidget(
DecoratedBox( DecoratedBox(
decoration: const BoxDecoration(), decoration: const BoxDecoration(),
...@@ -32,7 +35,9 @@ void main() { ...@@ -32,7 +35,9 @@ void main() {
expect(tester.takeException(), isFlutterError); expect(tester.takeException(), isFlutterError);
}); });
testWidgets('Box in a sliver', (WidgetTester tester) async { testWidgets('Box in a sliver',
experimentalLeakTesting: LeakTesting.settings.withIgnoredAll(), // leaking by design because of exception
(WidgetTester tester) async {
late ViewportOffset offset1; late ViewportOffset offset1;
addTearDown(() => offset1.dispose()); addTearDown(() => offset1.dispose());
await tester.pumpWidget( await tester.pumpWidget(
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart';
import 'test_widgets.dart'; import 'test_widgets.dart';
...@@ -164,7 +165,9 @@ void main() { ...@@ -164,7 +165,9 @@ void main() {
await tester.pumpWidget(Container()); await tester.pumpWidget(Container());
}); });
testWidgets('Setting state during dispose is forbidden', (WidgetTester tester) async { testWidgets('Setting state during dispose is forbidden',
experimentalLeakTesting: LeakTesting.settings.withIgnoredAll(), // leaking by design because of exception
(WidgetTester tester) async {
await tester.pumpWidget(const BadDisposeWidget()); await tester.pumpWidget(const BadDisposeWidget());
expect(tester.takeException(), isNull); expect(tester.takeException(), isNull);
await tester.pumpWidget(Container()); await tester.pumpWidget(Container());
......
...@@ -5,7 +5,6 @@ ...@@ -5,7 +5,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart';
import 'clipboard_utils.dart'; import 'clipboard_utils.dart';
import 'editable_text_utils.dart'; import 'editable_text_utils.dart';
...@@ -91,10 +90,7 @@ void main() { ...@@ -91,10 +90,7 @@ void main() {
expect(find.byKey(key2), findsNothing); expect(find.byKey(key2), findsNothing);
}); });
testWidgets('A menu can be hidden and then reshown', testWidgets('A menu can be hidden and then reshown', (WidgetTester tester) async {
// TODO(polina-c): clean up leaks, https://github.com/flutter/flutter/issues/134787 [leaks-to-clean]
experimentalLeakTesting: LeakTesting.settings.withIgnoredAll(),
(WidgetTester tester) async {
final GlobalKey key1 = GlobalKey(); final GlobalKey key1 = GlobalKey();
late final BuildContext context; late final BuildContext context;
...@@ -182,10 +178,7 @@ void main() { ...@@ -182,10 +178,7 @@ void main() {
controller.remove(); controller.remove();
}); });
testWidgets('Calling show when a built-in widget is already showing its context menu hides the built-in menu', testWidgets('Calling show when a built-in widget is already showing its context menu hides the built-in menu', (WidgetTester tester) async {
// TODO(polina-c): clean up leaks, https://github.com/flutter/flutter/issues/134787 [leaks-to-clean]
experimentalLeakTesting: LeakTesting.settings.withIgnoredAll(),
(WidgetTester tester) async {
final GlobalKey builtInKey = GlobalKey(); final GlobalKey builtInKey = GlobalKey();
final GlobalKey directKey = GlobalKey(); final GlobalKey directKey = GlobalKey();
late final BuildContext context; late final BuildContext context;
......
...@@ -2541,7 +2541,10 @@ void main() { ...@@ -2541,7 +2541,10 @@ void main() {
}); });
// Regression test for https://github.com/flutter/flutter/issues/6128. // Regression test for https://github.com/flutter/flutter/issues/6128.
testWidgets('Draggable plays nice with onTap', (WidgetTester tester) async { testWidgets('Draggable plays nice with onTap',
// TODO(polina-c): fix the leaking ImmediateMultiDragGestureRecognizer https://github.com/flutter/flutter/pull/144396 [leaks-to-clean]
experimentalLeakTesting: LeakTesting.settings.withIgnoredAll(),
(WidgetTester tester) async {
late final OverlayEntry entry; late final OverlayEntry entry;
addTearDown(() => entry..remove()..dispose()); addTearDown(() => entry..remove()..dispose());
...@@ -3432,7 +3435,7 @@ void main() { ...@@ -3432,7 +3435,7 @@ void main() {
// Regression test for https://github.com/flutter/flutter/issues/92083 // Regression test for https://github.com/flutter/flutter/issues/92083
testWidgets('feedback respect the MouseRegion cursor configure', testWidgets('feedback respect the MouseRegion cursor configure',
// TODO(polina-c): clean up leaks, https://github.com/flutter/flutter/issues/134787 [leaks-to-clean] // TODO(polina-c): fix the leaking ImmediateMultiDragGestureRecognizer https://github.com/flutter/flutter/pull/144396 [leaks-to-clean]
experimentalLeakTesting: LeakTesting.settings.withIgnoredAll(), experimentalLeakTesting: LeakTesting.settings.withIgnoredAll(),
(WidgetTester tester) async { (WidgetTester tester) async {
await tester.pumpWidget( await tester.pumpWidget(
......
...@@ -7,6 +7,7 @@ import 'dart:math' as math; ...@@ -7,6 +7,7 @@ import 'dart:math' as math;
import 'package:flutter/rendering.dart'; import 'package:flutter/rendering.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart';
import 'two_dimensional_utils.dart'; import 'two_dimensional_utils.dart';
...@@ -1062,7 +1063,10 @@ void main() { ...@@ -1062,7 +1063,10 @@ void main() {
return tester.element(findKey(vicinity)); return tester.element(findKey(vicinity));
} }
testWidgets('Axis.vertical', (WidgetTester tester) async { testWidgets('Axis.vertical',
// TODO(polina-c): RenderTwoDimensionalViewport should dispose _delegate https://github.com/flutter/flutter/issues/145628 [leaks-to-clean]
experimentalLeakTesting: LeakTesting.settings.withIgnoredAll(),
(WidgetTester tester) async {
await tester.pumpWidget(simpleBuilderTest(useCacheExtent: true)); await tester.pumpWidget(simpleBuilderTest(useCacheExtent: true));
Scrollable.ensureVisible(findContext( Scrollable.ensureVisible(findContext(
......
...@@ -8,6 +8,7 @@ import 'package:flutter/material.dart'; ...@@ -8,6 +8,7 @@ import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart'; import 'package:flutter/rendering.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart';
class HoverClient extends StatefulWidget { class HoverClient extends StatefulWidget {
const HoverClient({ const HoverClient({
...@@ -1836,7 +1837,10 @@ void main() { ...@@ -1836,7 +1837,10 @@ void main() {
}); });
// Regression test for https://github.com/flutter/flutter/issues/67044 // Regression test for https://github.com/flutter/flutter/issues/67044
testWidgets('Handle mouse events should ignore the detached MouseTrackerAnnotation', (WidgetTester tester) async { testWidgets('Handle mouse events should ignore the detached MouseTrackerAnnotation',
// TODO(polina-c): dispose gesture recognizers https://github.com/flutter/flutter/issues/145605 [leaks-to-clean]
experimentalLeakTesting: LeakTesting.settings.withIgnoredAll(),
(WidgetTester tester) async {
await tester.pumpWidget(MaterialApp( await tester.pumpWidget(MaterialApp(
home: Center( home: Center(
child: Draggable<int>( child: Draggable<int>(
......
...@@ -10,6 +10,7 @@ import 'package:flutter/rendering.dart'; ...@@ -10,6 +10,7 @@ import 'package:flutter/rendering.dart';
import 'package:flutter/scheduler.dart'; import 'package:flutter/scheduler.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart';
import 'navigator_utils.dart'; import 'navigator_utils.dart';
import 'observer_tester.dart'; import 'observer_tester.dart';
...@@ -1830,7 +1831,9 @@ void main() { ...@@ -1830,7 +1831,9 @@ void main() {
}); });
group('error control test', () { group('error control test', () {
testWidgets('onUnknownRoute null and onGenerateRoute returns null', (WidgetTester tester) async { testWidgets('onGenerateRoute returns null',
experimentalLeakTesting: LeakTesting.settings.withIgnoredAll(), // leaking by design because of exception
(WidgetTester tester) async {
final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>(); final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
await tester.pumpWidget(Navigator( await tester.pumpWidget(Navigator(
key: navigatorKey, key: navigatorKey,
...@@ -1856,7 +1859,9 @@ void main() { ...@@ -1856,7 +1859,9 @@ void main() {
); );
}); });
testWidgets('onUnknownRoute null and onGenerateRoute returns null', (WidgetTester tester) async { testWidgets('onUnknownRoute null and onGenerateRoute returns null',
experimentalLeakTesting: LeakTesting.settings.withIgnoredAll(), // leaking by design because of exception
(WidgetTester tester) async {
final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>(); final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
await tester.pumpWidget(Navigator( await tester.pumpWidget(Navigator(
key: navigatorKey, key: navigatorKey,
...@@ -2895,7 +2900,9 @@ void main() { ...@@ -2895,7 +2900,9 @@ void main() {
); );
}); });
testWidgets('throw if page list is empty', (WidgetTester tester) async { testWidgets('throw if page list is empty',
experimentalLeakTesting: LeakTesting.settings.withIgnoredAll(), // leaking by design because of exception
(WidgetTester tester) async {
final List<TestPage> myPages = <TestPage>[]; final List<TestPage> myPages = <TestPage>[];
final FlutterExceptionHandler? originalOnError = FlutterError.onError; final FlutterExceptionHandler? originalOnError = FlutterError.onError;
FlutterErrorDetails? firstError; FlutterErrorDetails? firstError;
......
...@@ -94,7 +94,10 @@ Future<void> main() async { ...@@ -94,7 +94,10 @@ Future<void> main() async {
); );
}); });
testWidgets('TestBorder and Directionality - 2', (WidgetTester tester) async { testWidgets('TestBorder and Directionality - 2',
// TODO(polina-c): dispose ImageStreamCompleterHandle, https://github.com/flutter/flutter/issues/145599 [leaks-to-clean]
experimentalLeakTesting: LeakTesting.settings.withIgnoredAll(),
(WidgetTester tester) async {
final List<String> log = <String>[]; final List<String> log = <String>[];
await tester.pumpWidget( await tester.pumpWidget(
Directionality( Directionality(
......
...@@ -7,6 +7,7 @@ import 'dart:ui'; ...@@ -7,6 +7,7 @@ import 'dart:ui';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart'; import 'package:flutter/rendering.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart';
import 'multi_view_testing.dart'; import 'multi_view_testing.dart';
...@@ -344,7 +345,10 @@ void main() { ...@@ -344,7 +345,10 @@ void main() {
}); });
}); });
testWidgets('correctly switches between view configurations', (WidgetTester tester) async { testWidgets('correctly switches between view configurations',
// TODO(polina-c): clean up leaks, https://github.com/flutter/flutter/issues/134787 [leaks-to-clean]
experimentalLeakTesting: LeakTesting.settings.withIgnoredAll(),
(WidgetTester tester) async {
await tester.pumpWidget( await tester.pumpWidget(
wrapWithView: false, wrapWithView: false,
View( View(
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment