Leak clean up. (#144803)

Fix some leaks and mark others.

[Known leaks](https://github.com/issues?q=is%3Aopen+is%3Aissue+label%3A%22a%3A+leak+tracking%22+-label%3A%22c%3A+new+feature%22+)
This commit is contained in:
Polina Cherkasova 2024-03-24 11:01:17 -07:00 committed by GitHub
parent e10049b2ff
commit 9fee27b244
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
27 changed files with 136 additions and 49 deletions

View file

@ -3263,6 +3263,12 @@ class _MenuPanel extends StatefulWidget {
class _MenuPanelState extends State<_MenuPanel> {
ScrollController scrollController = ScrollController();
@override
void dispose() {
scrollController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
final (MenuStyle? themeStyle, MenuStyle defaultStyle) = switch (widget.orientation) {

View file

@ -1410,18 +1410,23 @@ class _TabBarState extends State<TabBar> {
?? tabBarTheme.indicatorSize
?? _defaults.indicatorSize!;
final _IndicatorPainter? oldPainter = _indicatorPainter;
_indicatorPainter = !_controllerIsValid ? null : _IndicatorPainter(
controller: _controller!,
indicator: _getIndicator(indicatorSize),
indicatorSize: indicatorSize,
indicatorPadding: widget.indicatorPadding,
tabKeys: _tabKeys,
old: _indicatorPainter,
// Passing old painter so that the constructor can copy some values from it.
old: oldPainter,
labelPaddings: _labelPaddings,
dividerColor: widget.dividerColor ?? tabBarTheme.dividerColor ?? _defaults.dividerColor,
dividerHeight: widget.dividerHeight ?? tabBarTheme.dividerHeight ?? _defaults.dividerHeight,
showDivider: theme.useMaterial3 && !widget.isScrollable,
);
oldPainter?.dispose();
}
@override

View file

@ -9,6 +9,7 @@ library;
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart';
void main() {
/*
@ -77,7 +78,10 @@ void main() {
// 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
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);
addTearDown(animationSheet.dispose);
final List<Offset> taps = <Offset>[];

View file

@ -7,12 +7,16 @@ import 'dart:typed_data';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart';
import '../../image_data.dart';
late List<int> selectedTabs;
void main() {
// TODO(polina-c): dispose ImageStreamCompleterHandle, https://github.com/flutter/flutter/issues/145599 [leaks-to-clean]
LeakTesting.settings = LeakTesting.settings.withIgnoredAll();
setUp(() {
selectedTabs = <int>[];
});

View file

@ -6,6 +6,7 @@ import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart';
import '../image_data.dart';
import '../rendering/rendering_tester.dart' show TestCallbackPainter;
@ -39,6 +40,9 @@ class MockCupertinoTabController extends CupertinoTabController {
}
void main() {
// TODO(polina-c): dispose ImageStreamCompleterHandle, https://github.com/flutter/flutter/issues/145599 [leaks-to-clean]
LeakTesting.settings = LeakTesting.settings.withIgnoredAll();
setUp(() {
selectedTabs = <int>[];
});
@ -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);
addTearDown(controller.dispose);
final List<int> tabsPainted = <int>[];
@ -825,6 +831,8 @@ void main() {
testWidgets('A controller can control more than one CupertinoTabScaffold, '
'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 {
final List<int> tabsPainted0 = <int>[];
final List<int> tabsPainted1 = <int>[];
@ -1094,7 +1102,9 @@ void main() {
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(
CupertinoApp(
home: Builder(builder: (BuildContext context) {
@ -1267,7 +1277,10 @@ void main() {
.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(
CupertinoApp(
home: MediaQuery(

View file

@ -5,6 +5,7 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart';
void main() {
testWidgets('Use home', (WidgetTester tester) async {
@ -81,7 +82,9 @@ void main() {
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;
await tester.pumpWidget(
CupertinoApp(

View file

@ -49,6 +49,12 @@ Future<void> testExecutable(FutureOr<void> Function() testMain) {
LeakTesting.settings = LeakTesting.settings.withIgnored(
createdByTestHelpers: 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',
],
);
}

View file

@ -5,6 +5,7 @@
import 'package:flutter/gestures.dart';
import 'package:flutter/scheduler.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart';
import 'gesture_tester.dart';
@ -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 =
HorizontalDragGestureRecognizer()
..multitouchDragStrategy = MultitouchDragStrategy.averageBoundaryPointers;
@ -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 =
VerticalDragGestureRecognizer()
..multitouchDragStrategy = MultitouchDragStrategy.averageBoundaryPointers;
@ -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 =
PanGestureRecognizer()
..multitouchDragStrategy = MultitouchDragStrategy.averageBoundaryPointers;

View file

@ -5,6 +5,7 @@
import 'package:fake_async/fake_async.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart';
import 'package:meta/meta.dart';
class GestureTester {
@ -25,10 +26,14 @@ class GestureTester {
typedef GestureTest = void Function(GestureTester tester);
@isTest
void testGesture(String description, GestureTest callback) {
testWidgets(description, (_) async {
FakeAsync().run((FakeAsync async) {
callback(GestureTester._(async));
});
});
void testGesture(String description, GestureTest callback, {LeakTesting? experimentalLeakTesting}) {
testWidgets(
description,
(_) async {
FakeAsync().run((FakeAsync async) {
callback(GestureTester._(async));
});
},
experimentalLeakTesting: experimentalLeakTesting,
);
}

View file

@ -8,6 +8,7 @@ import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart';
class StateMarker extends StatefulWidget {
const StateMarker({ super.key, this.child });
@ -369,7 +370,9 @@ void main() {
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>[];
await tester.pumpWidget(
MaterialApp(

View file

@ -96,7 +96,7 @@ void main() {
});
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(),
(WidgetTester tester) async {
final ErrorImageProvider errorImage = ErrorImageProvider();

View file

@ -8,8 +8,12 @@ import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:leak_tracker_testing/leak_tracker_testing.dart';
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';
final List<DropdownMenuEntry<TestMenu>> menuChildren = <DropdownMenuEntry<TestMenu>>[];
@ -1800,8 +1804,7 @@ void main() {
checkExpectedHighlight(searchResult: 'Read', otherItems: <String>['All', 'Unread']);
});
testWidgets('onSelected gets called when a selection is made in a nested menu',
(WidgetTester tester) async {
testWidgets('onSelected gets called when a selection is made in a nested menu', (WidgetTester tester) async {
int selectionCount = 0;
final ThemeData themeData = ThemeData();

View file

@ -6,7 +6,6 @@ import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
Finder findMenuPanels() {
return find.byWidgetPredicate((Widget widget) => widget.runtimeType.toString() == '_MenuPanel');

View file

@ -2207,8 +2207,7 @@ void main() {
testWidgets(
'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(),
experimentalLeakTesting: LeakTesting.settings.withIgnoredAll(), // leaking by design because of exception
(WidgetTester tester) async {
final GlobalKey<ScaffoldState> key = GlobalKey<ScaffoldState>();
const Key buttonKey = Key('button');

View file

@ -973,8 +973,7 @@ void main() {
});
testWidgets(
"TabBarTheme's labelColor & unselectedLabelColor override labelStyle & unselectedLabelStyle colors",
(WidgetTester tester) async {
"TabBarTheme's labelColor & unselectedLabelColor override labelStyle & unselectedLabelStyle colors", (WidgetTester tester) async {
const Color labelColor = Color(0xfff00000);
const Color unselectedLabelColor = Color(0x95ff0000);
const TextStyle labelStyle = TextStyle(

View file

@ -7,6 +7,7 @@ import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/services.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 'feedback_tester.dart';
@ -112,6 +113,9 @@ Widget buildLeftRightApp({required List<String> tabs, required String value, boo
}
void main() {
// TODO(polina-c): dispose TabController, https://github.com/flutter/flutter/issues/144910 [leaks-to-clean]
LeakTesting.settings = LeakTesting.settings.withIgnoredAll();
setUp(() {
debugResetSemanticsIdCounter();
});

View file

@ -10,7 +10,6 @@ import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/services.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 {
assert(!renderObject.debugNeedsLayout);
@ -37,9 +36,6 @@ Future<void> verifyMarkedNeedsLayoutDuringTransientCallbacksPhase(WidgetTester t
}
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 {
await tester.pumpWidget(
const MaterialApp(

View file

@ -22,6 +22,7 @@ void main() {
group('RawImage', () {
testWidgets('properties', (WidgetTester tester) async {
final ui.Image image1 = (await tester.runAsync<ui.Image>(() => createTestImage()))!;
addTearDown(image1.dispose);
await tester.pumpWidget(
Directionality(
@ -50,6 +51,7 @@ void main() {
expect(renderObject.isAntiAlias, false);
final ui.Image image2 = (await tester.runAsync<ui.Image>(() => createTestImage(width: 2, height: 2)))!;
addTearDown(image2.dispose);
const String debugImageLabel = 'debugImageLabel';
const double width = 1;
const double height = 1;

View file

@ -5,9 +5,12 @@
import 'package:flutter/rendering.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart';
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(
DecoratedBox(
decoration: const BoxDecoration(),
@ -32,7 +35,9 @@ void main() {
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;
addTearDown(() => offset1.dispose());
await tester.pumpWidget(

View file

@ -4,6 +4,7 @@
import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart';
import 'test_widgets.dart';
@ -164,7 +165,9 @@ void main() {
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());
expect(tester.takeException(), isNull);
await tester.pumpWidget(Container());

View file

@ -5,7 +5,6 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart';
import 'clipboard_utils.dart';
import 'editable_text_utils.dart';
@ -91,10 +90,7 @@ void main() {
expect(find.byKey(key2), findsNothing);
});
testWidgets('A menu can be hidden and then reshown',
// TODO(polina-c): clean up leaks, https://github.com/flutter/flutter/issues/134787 [leaks-to-clean]
experimentalLeakTesting: LeakTesting.settings.withIgnoredAll(),
(WidgetTester tester) async {
testWidgets('A menu can be hidden and then reshown', (WidgetTester tester) async {
final GlobalKey key1 = GlobalKey();
late final BuildContext context;
@ -182,10 +178,7 @@ void main() {
controller.remove();
});
testWidgets('Calling show when a built-in widget is already showing its context menu hides the built-in menu',
// TODO(polina-c): clean up leaks, https://github.com/flutter/flutter/issues/134787 [leaks-to-clean]
experimentalLeakTesting: LeakTesting.settings.withIgnoredAll(),
(WidgetTester tester) async {
testWidgets('Calling show when a built-in widget is already showing its context menu hides the built-in menu', (WidgetTester tester) async {
final GlobalKey builtInKey = GlobalKey();
final GlobalKey directKey = GlobalKey();
late final BuildContext context;

View file

@ -2541,7 +2541,10 @@ void main() {
});
// 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;
addTearDown(() => entry..remove()..dispose());
@ -3432,7 +3435,7 @@ void main() {
// Regression test for https://github.com/flutter/flutter/issues/92083
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(),
(WidgetTester tester) async {
await tester.pumpWidget(

View file

@ -7,6 +7,7 @@ import 'dart:math' as math;
import 'package:flutter/rendering.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart';
import 'two_dimensional_utils.dart';
@ -1062,7 +1063,10 @@ void main() {
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));
Scrollable.ensureVisible(findContext(

View file

@ -8,6 +8,7 @@ import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart';
class HoverClient extends StatefulWidget {
const HoverClient({
@ -1836,7 +1837,10 @@ void main() {
});
// 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(
home: Center(
child: Draggable<int>(

View file

@ -10,6 +10,7 @@ import 'package:flutter/rendering.dart';
import 'package:flutter/scheduler.dart';
import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart';
import 'navigator_utils.dart';
import 'observer_tester.dart';
@ -1830,7 +1831,9 @@ void main() {
});
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>();
await tester.pumpWidget(Navigator(
key: navigatorKey,
@ -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>();
await tester.pumpWidget(Navigator(
key: navigatorKey,
@ -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 FlutterExceptionHandler? originalOnError = FlutterError.onError;
FlutterErrorDetails? firstError;

View file

@ -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>[];
await tester.pumpWidget(
Directionality(

View file

@ -7,6 +7,7 @@ import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart';
import 'multi_view_testing.dart';
@ -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(
wrapWithView: false,
View(