[test cross imports] flutter_test cross import fixes (#189265)
This PR fixes some more tests in flutter_test in relation to importing
Material
The `finders_test` was cleaned up a lot, but the remainder in that file
is related to Material Tooltip, which is still a point of discussion
relating to its test Finders.
Part of https://github.com/flutter/flutter/issues/177415
*If you had to change anything in the [flutter/tests] repo, include a
link to the migration guide as per the [breaking change policy].*
## Pre-launch Checklist
- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [x] I read the [AI contribution guidelines] and understand my
responsibilities, or I am not using AI tools.
- [x] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [x] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [x] I signed the [CLA].
- [x] I listed at least one issue that this PR fixes in the description
above.
- [x] I updated/added relevant documentation (doc comments with `///`).
- [x] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [x] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [x] All existing and new tests are passing.
If you need help, consider asking for advice on the #hackers-new channel
on [Discord].
If this change needs to override an active code freeze, provide a
comment explaining why. The code freeze workflow can be overridden by
code reviewers. See pinned issues for any active code freezes with
guidance.
**Note**: The Flutter team is currently trialing the use of [Gemini Code
Assist for
GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code).
Comments from the `gemini-code-assist` bot should not be taken as
authoritative feedback from the Flutter team. If you find its comments
useful you can update your code accordingly, but if you are unsure or
disagree with the feedback, please feel free to wait for a Flutter team
member's review for guidance on which automated comments should be
addressed.
<!-- Links -->
[Contributor Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview
[AI contribution guidelines]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#ai-contribution-guidelines
[Tree Hygiene]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md
[test-exempt]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests
[Flutter Style Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md
[Features we expect every widget to implement]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement
[CLA]: https://cla.developers.google.com/
[flutter/tests]: https://github.com/flutter/tests
[breaking change policy]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes
[Discord]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md
[Data Driven Fixes]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md
diff --git a/dev/bots/check_tests_cross_imports.dart b/dev/bots/check_tests_cross_imports.dart
index d0bf944..b51c2c6 100644
--- a/dev/bots/check_tests_cross_imports.dart
+++ b/dev/bots/check_tests_cross_imports.dart
@@ -187,17 +187,8 @@
'packages/flutter_test/lib/src/widget_tester.dart',
'packages/flutter_test/lib/src/finders.dart',
'packages/flutter_test/lib/src/matchers.dart',
- 'packages/flutter_test/test_fixes/flutter_test/animation_sheet_builder.dart',
- 'packages/flutter_test/test_fixes/flutter_test/matchers.dart',
- 'packages/flutter_test/test/navigator_test.dart',
- 'packages/flutter_test/test/mock_canvas_test.dart',
- 'packages/flutter_test/test/semantics_finder_test.dart',
'packages/flutter_test/test/accessibility_window_test.dart',
- 'packages/flutter_test/test/widget_tester_live_device_test.dart',
- 'packages/flutter_test/test/all_elements_test.dart',
- 'packages/flutter_test/test/utils/memory_leak_tests.dart',
'packages/flutter_test/test/widget_tester_test.dart',
- 'packages/flutter_test/test/live_widget_controller_test.dart',
'packages/flutter_test/test/accessibility_test.dart',
'packages/flutter_test/test/finders_test.dart',
'packages/flutter_test/test/controller_test.dart',
diff --git a/packages/flutter_test/test/all_elements_test.dart b/packages/flutter_test/test/all_elements_test.dart
index 8f43efd..11569a9 100644
--- a/packages/flutter_test/test/all_elements_test.dart
+++ b/packages/flutter_test/test/all_elements_test.dart
@@ -2,7 +2,7 @@
// 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/widgets.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
diff --git a/packages/flutter_test/test/finders_test.dart b/packages/flutter_test/test/finders_test.dart
index 311a3cd..34953a6 100644
--- a/packages/flutter_test/test/finders_test.dart
+++ b/packages/flutter_test/test/finders_test.dart
@@ -8,6 +8,8 @@
import 'package:flutter/rendering.dart';
import 'package:flutter_test/flutter_test.dart';
+const _kBlue = Color(0xFF0000FF);
+
const List<Widget> fooBarTexts = <Text>[
Text('foo', textDirection: TextDirection.ltr),
Text('bar', textDirection: TextDirection.ltr),
@@ -24,9 +26,9 @@
testWidgets('finds Button widgets with Image', (WidgetTester tester) async {
addTearDown(imageCache.clear);
await tester.pumpWidget(
- _boilerplate(ElevatedButton(onPressed: null, child: Image(image: FileImage(File('test'))))),
+ _boilerplate(TestButton(child: Image(image: FileImage(File('test'))))),
);
- expect(find.widgetWithImage(ElevatedButton, FileImage(File('test'))), findsOneWidget);
+ expect(find.widgetWithImage(TestButton, FileImage(File('test'))), findsOneWidget);
});
});
@@ -170,9 +172,19 @@
testWidgets('finds EditableText widgets', (WidgetTester tester) async {
final controller = TextEditingController()..text = 'this is test';
addTearDown(controller.dispose);
+ final focusNode = FocusNode();
+ addTearDown(focusNode.dispose);
await tester.pumpWidget(
- MaterialApp(
- home: Scaffold(body: _boilerplate(TextField(controller: controller))),
+ TestWidgetsApp(
+ home: _boilerplate(
+ EditableText(
+ controller: controller,
+ focusNode: focusNode,
+ style: const TextStyle(),
+ cursorColor: const Color(0xFF000000),
+ backgroundCursorColor: _kBlue,
+ ),
+ ),
),
);
@@ -276,7 +288,7 @@
Semantics(
label: 'Add',
button: true,
- child: const TextButton(onPressed: null, child: Text('+')),
+ child: const TestButton(child: Text('+')),
),
),
);
@@ -308,22 +320,20 @@
semanticsHandle.dispose();
});
- testWidgets(
- 'Throws StateError if semantics are not enabled (bySemanticsIdentifier)',
- (WidgetTester tester) async {
- expect(
- () => find.bySemanticsIdentifier('Add'),
- throwsA(
- isA<StateError>().having(
- (StateError e) => e.message,
- 'message',
- contains('Semantics are not enabled'),
- ),
+ testWidgets('Throws StateError if semantics are not enabled (bySemanticsIdentifier)', (
+ WidgetTester tester,
+ ) async {
+ expect(
+ () => find.bySemanticsIdentifier('Add'),
+ throwsA(
+ isA<StateError>().having(
+ (StateError e) => e.message,
+ 'message',
+ contains('Semantics are not enabled'),
),
- );
- },
- semanticsEnabled: false,
- );
+ ),
+ );
+ }, semanticsEnabled: false);
testWidgets('finds Semantically labeled widgets by identifier', (WidgetTester tester) async {
final SemanticsHandle semanticsHandle = tester.ensureSemantics();
@@ -332,7 +342,7 @@
Semantics(
identifier: 'Add',
button: true,
- child: const TextButton(onPressed: null, child: Text('+')),
+ child: const TestButton(child: Text('+')),
),
),
);
@@ -825,7 +835,7 @@
(WidgetTester tester) async {
var tapCount = 0;
await tester.pumpWidget(
- MaterialApp(
+ TestWidgetsApp(
home: ListView(
children: <Widget>[
const SizedBox(height: 2000), // Push the target off-screen
@@ -854,27 +864,23 @@
testWidgets('tapping directly on a Sliver produces an error', (WidgetTester tester) async {
var sliverToBoxAdapterTapped = 0;
await tester.pumpWidget(
- MaterialApp(
- title: 'Flutter Demo',
- theme: ThemeData(primarySwatch: Colors.blue),
- home: Scaffold(
- body: SafeArea(
- child: CustomScrollView(
- slivers: <Widget>[
- SliverToBoxAdapter(
- child: GestureDetector(
- onTap: () {
- sliverToBoxAdapterTapped++;
- },
- child: Container(
- color: Colors.orange,
- padding: const EdgeInsets.all(16.0),
- child: const Text('Sliver Grid Header', style: TextStyle(fontSize: 28)),
- ),
+ TestWidgetsApp(
+ home: SafeArea(
+ child: CustomScrollView(
+ slivers: <Widget>[
+ SliverToBoxAdapter(
+ child: GestureDetector(
+ onTap: () {
+ sliverToBoxAdapterTapped++;
+ },
+ child: Container(
+ color: _kBlue,
+ padding: const EdgeInsets.all(16.0),
+ child: const Text('Sliver Grid Header', style: TextStyle(fontSize: 28)),
),
),
- ],
- ),
+ ),
+ ],
),
),
),
@@ -898,27 +904,23 @@
) async {
var sliverToBoxAdapterTapped = 0;
await tester.pumpWidget(
- MaterialApp(
- title: 'Flutter Demo',
- theme: ThemeData(primarySwatch: Colors.blue),
- home: Scaffold(
- body: SafeArea(
- child: CustomScrollView(
- slivers: <Widget>[
- SliverToBoxAdapter(
- child: GestureDetector(
- onTap: () {
- sliverToBoxAdapterTapped++;
- },
- child: Container(
- color: Colors.orange,
- padding: const EdgeInsets.all(16.0),
- child: const Text('Sliver Grid Header', style: TextStyle(fontSize: 28)),
- ),
+ TestWidgetsApp(
+ home: SafeArea(
+ child: CustomScrollView(
+ slivers: <Widget>[
+ SliverToBoxAdapter(
+ child: GestureDetector(
+ onTap: () {
+ sliverToBoxAdapterTapped++;
+ },
+ child: Container(
+ color: _kBlue,
+ padding: const EdgeInsets.all(16.0),
+ child: const Text('Sliver Grid Header', style: TextStyle(fontSize: 28)),
),
),
- ],
- ),
+ ),
+ ],
),
),
),
@@ -1770,7 +1772,7 @@
final controller = ScrollController();
addTearDown(controller.dispose);
await tester.pumpWidget(
- MaterialApp(
+ TestWidgetsApp(
home: SingleChildScrollView(
controller: controller,
child: const SizedBox(width: 100, height: 1000),
@@ -1788,7 +1790,7 @@
final controller = ScrollController(initialScrollOffset: 400);
addTearDown(controller.dispose);
await tester.pumpWidget(
- MaterialApp(
+ TestWidgetsApp(
home: SingleChildScrollView(
controller: controller,
child: const SizedBox(width: 100, height: 1000),
@@ -1806,7 +1808,7 @@
final controller = ScrollController();
addTearDown(controller.dispose);
await tester.pumpWidget(
- MaterialApp(
+ TestWidgetsApp(
home: SingleChildScrollView(
scrollDirection: Axis.horizontal,
controller: controller,
@@ -1825,7 +1827,7 @@
final controller = ScrollController(initialScrollOffset: 200);
addTearDown(controller.dispose);
await tester.pumpWidget(
- MaterialApp(
+ TestWidgetsApp(
home: SingleChildScrollView(
scrollDirection: Axis.horizontal,
controller: controller,
@@ -1844,7 +1846,7 @@
WidgetTester tester,
) async {
await tester.pumpWidget(
- const MaterialApp(
+ const TestWidgetsApp(
home: Column(
children: <Widget>[
SingleChildScrollView(
@@ -1862,7 +1864,7 @@
testWidgets('can exclusively find node that scrolls vertically', (WidgetTester tester) async {
await tester.pumpWidget(
- const MaterialApp(
+ const TestWidgetsApp(
home: Column(
children: <Widget>[
SingleChildScrollView(
@@ -2062,7 +2064,7 @@
textDirection: TextDirection.ltr,
child: Navigator(
onGenerateRoute: (RouteSettings settings) {
- return MaterialPageRoute<void>(builder: (BuildContext context) => child);
+ return TestRoute<void>(builder: (BuildContext context) => child);
},
),
);
@@ -2119,6 +2121,106 @@
return tree;
}
+class TestRoute<T> extends PageRoute<T> {
+ TestRoute({
+ this.child,
+ this.builder,
+ RouteSettings super.settings = const RouteSettings(),
+ this.barrierColor,
+ this.maintainState = false,
+ this.transitionDuration = Duration.zero,
+ this.reverseTransitionDuration = Duration.zero,
+ this.transitionsBuilder,
+ super.fullscreenDialog,
+ super.allowSnapshotting,
+ }) : assert(child != null || builder != null, 'Either child or builder must be provided.');
+
+ final Widget? child;
+ final WidgetBuilder? builder;
+ final PageTransitionsBuilder? transitionsBuilder;
+
+ @override
+ final Duration transitionDuration;
+
+ @override
+ final Duration reverseTransitionDuration;
+
+ @override
+ final Color? barrierColor;
+
+ @override
+ String? get barrierLabel => null;
+
+ @override
+ final bool maintainState;
+
+ @override
+ Widget buildPage(
+ BuildContext context,
+ Animation<double> animation,
+ Animation<double> secondaryAnimation,
+ ) {
+ return child ?? builder?.call(context) ?? const SizedBox.shrink();
+ }
+
+ @override
+ Widget buildTransitions(
+ BuildContext context,
+ Animation<double> animation,
+ Animation<double> secondaryAnimation,
+ Widget child,
+ ) {
+ if (transitionsBuilder == null) {
+ return child;
+ }
+
+ return transitionsBuilder!.buildTransitions<T>(
+ this,
+ context,
+ animation,
+ secondaryAnimation,
+ child,
+ );
+ }
+}
+
+class TestButton extends StatelessWidget {
+ const TestButton({
+ required this.child,
+ this.focusNode,
+ this.autofocus = false,
+ this.onPressed,
+ this.behavior,
+ super.key,
+ });
+
+ final bool autofocus;
+ final FocusNode? focusNode;
+ final VoidCallback? onPressed;
+ final Widget child;
+ final HitTestBehavior? behavior;
+
+ void _onFocus() => focusNode?.requestFocus();
+
+ @override
+ Widget build(BuildContext context) {
+ return Semantics(
+ label: 'button',
+ button: true,
+ enabled: onPressed != null,
+ onTap: onPressed,
+ onFocus: _onFocus,
+ focusable: true,
+ child: FocusableActionDetector(
+ enabled: onPressed != null,
+ focusNode: focusNode,
+ autofocus: autofocus,
+ child: GestureDetector(behavior: behavior, onTap: onPressed, child: child),
+ ),
+ );
+ }
+}
+
class _FakeFinder extends FinderBase<String> {
_FakeFinder({
this.allCandidatesCallback,
diff --git a/packages/flutter_test/test/live_binding_test.dart b/packages/flutter_test/test/live_binding_test.dart
index 6f4f588..71a6deb 100644
--- a/packages/flutter_test/test/live_binding_test.dart
+++ b/packages/flutter_test/test/live_binding_test.dart
@@ -9,36 +9,9 @@
// This file is for testings that require a `LiveTestWidgetsFlutterBinding`
void main() {
- PageRoute<T> defaultPageRouteBuilder<T>(RouteSettings settings, WidgetBuilder builder) {
- return PageRouteBuilder<T>(
- settings: settings,
- pageBuilder:
- (
- BuildContext context,
- Animation<double> animation,
- Animation<double> secondaryAnimation,
- ) => builder(context),
- transitionsBuilder:
- (
- BuildContext context,
- Animation<double> animation,
- Animation<double> secondaryAnimation,
- Widget child,
- ) => child,
- );
- }
-
- Widget buildTestApp({required Widget child}) {
- return WidgetsApp(
- color: const Color(0xFFFFFFFF),
- pageRouteBuilder: defaultPageRouteBuilder,
- home: SizedBox.expand(child: Center(child: child)),
- );
- }
-
final binding = LiveTestWidgetsFlutterBinding();
testWidgets('Input PointerAddedEvent', (WidgetTester tester) async {
- await tester.pumpWidget(buildTestApp(child: const Text('Test')));
+ await tester.pumpWidget(const TestWidgetsApp(home: Text('Test')));
await tester.pump();
final TestGesture gesture = await tester.createGesture();
// This mimics the start of a gesture as seen on a device, where inputs
@@ -50,8 +23,8 @@
testWidgets('Input PointerHoverEvent', (WidgetTester tester) async {
PointerHoverEvent? hoverEvent;
await tester.pumpWidget(
- buildTestApp(
- child: MouseRegion(
+ TestWidgetsApp(
+ home: MouseRegion(
child: const Text('Test'),
onHover: (PointerHoverEvent event) {
hoverEvent = event;
@@ -71,8 +44,8 @@
testWidgets('hitTesting works when using setSurfaceSize', (WidgetTester tester) async {
var invocations = 0;
await tester.pumpWidget(
- buildTestApp(
- child: GestureDetector(
+ TestWidgetsApp(
+ home: GestureDetector(
onTap: () {
invocations++;
},
@@ -100,7 +73,7 @@
testWidgets('setSurfaceSize works', (WidgetTester tester) async {
addTearDown(binding.resetLayers);
- await tester.pumpWidget(buildTestApp(child: const Text('Test')));
+ await tester.pumpWidget(const TestWidgetsApp(home: Center(child: Text('Test'))));
final Size windowCenter = tester.view.physicalSize / tester.view.devicePixelRatio / 2;
final double windowCenterX = windowCenter.width;
diff --git a/packages/flutter_test/test/live_widget_controller_test.dart b/packages/flutter_test/test/live_widget_controller_test.dart
index ac354b9..01bd204 100644
--- a/packages/flutter_test/test/live_widget_controller_test.dart
+++ b/packages/flutter_test/test/live_widget_controller_test.dart
@@ -4,8 +4,8 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/gestures.dart';
-import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';
+import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart';
// This test is very fragile and bypasses some zone-related checks.
@@ -47,9 +47,9 @@
int counter = 0;
@override
Widget build(BuildContext context) {
- return ElevatedButton(
+ return GestureDetector(
child: Text('Counter $counter'),
- onPressed: () {
+ onTap: () {
setState(() {
counter += 1;
});
@@ -93,7 +93,7 @@
TestBinding.ensureInitialized();
test('Test pump on LiveWidgetController', () async {
- runApp(const MaterialApp(home: Center(child: CountButton())));
+ runApp(const TestWidgetsApp(home: CountButton()));
await SchedulerBinding.instance.endOfFrame;
final WidgetController controller = LiveWidgetController(WidgetsBinding.instance);
@@ -106,7 +106,7 @@
});
test('Test pumpAndSettle on LiveWidgetController', () async {
- runApp(const MaterialApp(home: Center(child: AnimateSample())));
+ runApp(const TestWidgetsApp(home: AnimateSample()));
await SchedulerBinding.instance.endOfFrame;
final WidgetController controller = LiveWidgetController(WidgetsBinding.instance);
expect(find.text('Value: 1.0'), findsNothing);
@@ -117,7 +117,7 @@
test('Input event array on LiveWidgetController', () async {
final logs = <String>[];
runApp(
- MaterialApp(
+ TestWidgetsApp(
home: Listener(
onPointerDown: (PointerDownEvent event) => logs.add('down ${event.buttons}'),
onPointerMove: (PointerMoveEvent event) => logs.add('move ${event.buttons}'),
diff --git a/packages/flutter_test/test/mock_canvas_test.dart b/packages/flutter_test/test/mock_canvas_test.dart
index 92362c9..4afb3e8 100644
--- a/packages/flutter_test/test/mock_canvas_test.dart
+++ b/packages/flutter_test/test/mock_canvas_test.dart
@@ -4,9 +4,12 @@
import 'dart:math' as math;
-import 'package:flutter/material.dart';
+import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart';
+const _kTransparent = Color(0x00000000);
+const _kBlue = Color(0xFF0000FF);
+
class MyPainter extends CustomPainter {
const MyPainter({required this.color});
@@ -55,7 +58,7 @@
testWidgets('matches when the predicate returns true', (WidgetTester tester) async {
await tester.pumpWidget(
const CustomPaint(
- painter: MyPainter(color: Colors.transparent),
+ painter: MyPainter(color: _kTransparent),
child: SizedBox(width: 50, height: 50),
),
);
@@ -72,7 +75,7 @@
expect(methodsAndArguments, <MethodAndArguments>[
const MethodAndArguments(#save, <dynamic>[]),
- const MethodAndArguments(#drawColor, <dynamic>[Colors.transparent, BlendMode.color]),
+ const MethodAndArguments(#drawColor, <dynamic>[_kTransparent, BlendMode.color]),
// The #restore call is never evaluated
]);
});
@@ -80,7 +83,7 @@
testWidgets('fails when the predicate always returns false', (WidgetTester tester) async {
await tester.pumpWidget(
const CustomPaint(
- painter: MyPainter(color: Colors.transparent),
+ painter: MyPainter(color: _kTransparent),
child: SizedBox(width: 50, height: 50),
),
);
@@ -99,7 +102,7 @@
expect(methodsAndArguments, <MethodAndArguments>[
const MethodAndArguments(#save, <dynamic>[]),
- const MethodAndArguments(#drawColor, <dynamic>[Colors.transparent, BlendMode.color]),
+ const MethodAndArguments(#drawColor, <dynamic>[_kTransparent, BlendMode.color]),
const MethodAndArguments(#restore, <dynamic>[]),
]);
});
@@ -107,7 +110,7 @@
testWidgets('fails when the predicate throws', (WidgetTester tester) async {
await tester.pumpWidget(
const CustomPaint(
- painter: MyPainter(color: Colors.transparent),
+ painter: MyPainter(color: _kTransparent),
child: SizedBox(width: 50, height: 50),
),
);
@@ -132,7 +135,7 @@
expect(methodsAndArguments, <MethodAndArguments>[
const MethodAndArguments(#save, <dynamic>[]),
- const MethodAndArguments(#drawColor, <dynamic>[Colors.transparent, BlendMode.color]),
+ const MethodAndArguments(#drawColor, <dynamic>[_kTransparent, BlendMode.color]),
// The #restore call is never evaluated
]);
});
@@ -142,7 +145,7 @@
testWidgets('matches when the predicate always returns true', (WidgetTester tester) async {
await tester.pumpWidget(
const CustomPaint(
- painter: MyPainter(color: Colors.transparent),
+ painter: MyPainter(color: _kTransparent),
child: SizedBox(width: 50, height: 50),
),
);
@@ -159,7 +162,7 @@
expect(methodsAndArguments, <MethodAndArguments>[
const MethodAndArguments(#save, <dynamic>[]),
- const MethodAndArguments(#drawColor, <dynamic>[Colors.transparent, BlendMode.color]),
+ const MethodAndArguments(#drawColor, <dynamic>[_kTransparent, BlendMode.color]),
const MethodAndArguments(#restore, <dynamic>[]),
]);
});
@@ -167,7 +170,7 @@
testWidgets('fails when the predicate returns false', (WidgetTester tester) async {
await tester.pumpWidget(
const CustomPaint(
- painter: MyPainter(color: Colors.transparent),
+ painter: MyPainter(color: _kTransparent),
child: SizedBox(width: 50, height: 50),
),
);
@@ -187,7 +190,7 @@
expect(methodsAndArguments, <MethodAndArguments>[
const MethodAndArguments(#save, <dynamic>[]),
- const MethodAndArguments(#drawColor, <dynamic>[Colors.transparent, BlendMode.color]),
+ const MethodAndArguments(#drawColor, <dynamic>[_kTransparent, BlendMode.color]),
// The #restore call is never evaluated
]);
});
@@ -195,7 +198,7 @@
testWidgets('fails if the predicate ever throws', (WidgetTester tester) async {
await tester.pumpWidget(
const CustomPaint(
- painter: MyPainter(color: Colors.transparent),
+ painter: MyPainter(color: _kTransparent),
child: SizedBox(width: 50, height: 50),
),
);
@@ -217,7 +220,7 @@
expect(methodsAndArguments, <MethodAndArguments>[
const MethodAndArguments(#save, <dynamic>[]),
- const MethodAndArguments(#drawColor, <dynamic>[Colors.transparent, BlendMode.color]),
+ const MethodAndArguments(#drawColor, <dynamic>[_kTransparent, BlendMode.color]),
// The #restore call is never evaluated
]);
});
@@ -228,7 +231,7 @@
const double startAngle = math.pi / 4;
const double sweepAngle = math.pi / 2;
const useCenter = false;
- final paint = Paint()..color = Colors.blue;
+ final paint = Paint()..color = _kBlue;
Future<void> pumpPainter(WidgetTester tester) async {
await tester.pumpWidget(
@@ -357,7 +360,7 @@
Offset.zero & const Size.square(50),
const Radius.circular(5),
);
- final paint = Paint()..color = Colors.blue;
+ final paint = Paint()..color = _kBlue;
Future<void> pumpPainter(WidgetTester tester) async {
await tester.pumpWidget(
diff --git a/packages/flutter_test/test/navigator_test.dart b/packages/flutter_test/test/navigator_test.dart
index 63a355e..6040390 100644
--- a/packages/flutter_test/test/navigator_test.dart
+++ b/packages/flutter_test/test/navigator_test.dart
@@ -2,7 +2,7 @@
// 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/widgets.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
@@ -12,106 +12,95 @@
final observer = TransitionDurationObserver();
await tester.pumpWidget(
- MaterialApp(
+ WidgetsApp(
+ color: const Color(0xFFFFFFFF),
navigatorObservers: <NavigatorObserver>[observer],
onGenerateRoute: (RouteSettings settings) {
return switch (settings.name) {
- // A route that uses FadeForwardsPageTransitionsBuilder.
'/' => _TestTransitionRoute<void>(
- pageTransitionsBuilder: const FadeForwardsPageTransitionsBuilder(),
+ pageTransitionsBuilder: const _TestSlideUpPageTransitionsBuilder(),
builder: (BuildContext context) {
- return Scaffold(
- body: Center(
- child: Column(
- children: <Widget>[
- const Text('Page 1'),
- TextButton(
- onPressed: () {
- Navigator.pushNamed(context, '/2');
- },
- child: const Text('Next'),
- ),
- ],
- ),
+ return Center(
+ child: Column(
+ children: <Widget>[
+ const Text('Page 1'),
+ GestureDetector(
+ onTap: () {
+ Navigator.pushNamed(context, '/2');
+ },
+ child: const Text('Next'),
+ ),
+ ],
),
);
},
),
- // A route that uses ZoomPageTransitionsBuilder with custom durations.
'/2' => _TestTransitionRoute<void>(
- pageTransitionsBuilder: const ZoomPageTransitionsBuilder(),
+ pageTransitionsBuilder: const _TestSlightRightPageTransitionsBuilder(),
transitionDurationOverride: const Duration(milliseconds: 456),
reverseTransitionDurationOverride: const Duration(milliseconds: 567),
builder: (BuildContext context) {
- return Scaffold(
- body: Center(
- child: Column(
- children: <Widget>[
- const Text('Page 2'),
- TextButton(
- onPressed: () {
- Navigator.pushNamed(context, '/3');
- },
- child: const Text('Next'),
- ),
- TextButton(
- onPressed: () {
- Navigator.pop(context);
- },
- child: const Text('Back'),
- ),
- ],
- ),
+ return Center(
+ child: Column(
+ children: <Widget>[
+ const Text('Page 2'),
+ GestureDetector(
+ onTap: () {
+ Navigator.pushNamed(context, '/3');
+ },
+ child: const Text('Next'),
+ ),
+ GestureDetector(
+ onTap: () {
+ Navigator.pop(context);
+ },
+ child: const Text('Back'),
+ ),
+ ],
),
);
},
),
- // A route that uses FadeForwardsPageTransitionsBuilder with custom durations.
'/3' => _TestTransitionRoute<void>(
- pageTransitionsBuilder: const FadeForwardsPageTransitionsBuilder(),
+ pageTransitionsBuilder: const _TestSlideUpPageTransitionsBuilder(),
transitionDurationOverride: const Duration(milliseconds: 678),
reverseTransitionDurationOverride: const Duration(milliseconds: 789),
builder: (BuildContext context) {
- return Scaffold(
- body: Center(
- child: Column(
- children: <Widget>[
- const Text('Page 3'),
- TextButton(
- onPressed: () {
- Navigator.pushNamed(context, '/4');
- },
- child: const Text('Next'),
- ),
- TextButton(
- onPressed: () {
- Navigator.pop(context);
- },
- child: const Text('Back'),
- ),
- ],
- ),
+ return Center(
+ child: Column(
+ children: <Widget>[
+ const Text('Page 3'),
+ GestureDetector(
+ onTap: () {
+ Navigator.pushNamed(context, '/4');
+ },
+ child: const Text('Next'),
+ ),
+ GestureDetector(
+ onTap: () {
+ Navigator.pop(context);
+ },
+ child: const Text('Back'),
+ ),
+ ],
),
);
},
),
- // A route that uses ZoomPageTransitionsBuilder.
'/4' => _TestTransitionRoute<void>(
- pageTransitionsBuilder: const ZoomPageTransitionsBuilder(),
+ pageTransitionsBuilder: const _TestSlightRightPageTransitionsBuilder(),
builder: (BuildContext context) {
- return Scaffold(
- body: Center(
- child: Column(
- children: <Widget>[
- const Text('Page 4'),
- TextButton(
- onPressed: () {
- Navigator.pop(context);
- },
- child: const Text('Back'),
- ),
- ],
- ),
+ return Center(
+ child: Column(
+ children: <Widget>[
+ const Text('Page 4'),
+ GestureDetector(
+ onTap: () {
+ Navigator.pop(context);
+ },
+ child: const Text('Back'),
+ ),
+ ],
),
);
},
@@ -129,7 +118,7 @@
expect(
observer.transitionDuration,
- const FadeForwardsPageTransitionsBuilder().transitionDuration,
+ const _TestSlideUpPageTransitionsBuilder().transitionDuration,
);
await tester.tap(find.text('Next'));
@@ -153,7 +142,10 @@
expect(find.text('Page 4'), findsNothing);
await tester.tap(find.text('Next'));
- expect(observer.transitionDuration, const ZoomPageTransitionsBuilder().transitionDuration);
+ expect(
+ observer.transitionDuration,
+ const _TestSlightRightPageTransitionsBuilder().transitionDuration,
+ );
await observer.pumpPastTransition(tester);
@@ -165,7 +157,7 @@
await tester.tap(find.text('Back'));
expect(
observer.transitionDuration,
- const ZoomPageTransitionsBuilder().reverseTransitionDuration,
+ const _TestSlightRightPageTransitionsBuilder().reverseTransitionDuration,
);
await observer.pumpPastTransition(tester);
@@ -202,16 +194,15 @@
final observer = TransitionDurationObserver();
await tester.pumpWidget(
- MaterialApp(
+ WidgetsApp(
+ color: const Color(0xFFFFFFFF),
navigatorObservers: <NavigatorObserver>[observer],
onGenerateRoute: (RouteSettings settings) {
return switch (settings.name) {
// A route with no transition.
'/' => _TestOverlayRoute<void>(
builder: (BuildContext context) {
- return const Scaffold(
- body: Center(child: Column(children: <Widget>[Text('Page 1')])),
- );
+ return const Center(child: Column(children: <Widget>[Text('Page 1')]));
},
),
_ => throw Exception('Invalid route.'),
@@ -225,19 +216,79 @@
});
}
-class _TestTransitionRoute<T> extends MaterialPageRoute<T> {
+class _TestSlightRightPageTransitionsBuilder extends PageTransitionsBuilder {
+ const _TestSlightRightPageTransitionsBuilder();
+
+ @override
+ Widget buildTransitions<T>(
+ PageRoute<T> route,
+ BuildContext context,
+ Animation<double> animation,
+ Animation<double> secondaryAnimation,
+ Widget child,
+ ) {
+ const begin = Offset(1.0, 0.0);
+ const Offset end = .zero;
+ final Animatable<Offset> tween = Tween<Offset>(
+ begin: begin,
+ end: end,
+ ).chain(CurveTween(curve: Curves.ease));
+
+ return SlideTransition(
+ position: animation.drive(tween),
+ child: FadeTransition(opacity: animation, child: child),
+ );
+ }
+}
+
+class _TestSlideUpPageTransitionsBuilder extends PageTransitionsBuilder {
+ const _TestSlideUpPageTransitionsBuilder();
+
+ @override
+ Widget buildTransitions<T>(
+ PageRoute<T> route,
+ BuildContext context,
+ Animation<double> animation,
+ Animation<double> secondaryAnimation,
+ Widget child,
+ ) {
+ const begin = Offset(0.0, 1.0);
+ const Offset end = .zero;
+ final Animatable<Offset> tween = Tween<Offset>(
+ begin: begin,
+ end: end,
+ ).chain(CurveTween(curve: Curves.ease));
+
+ return SlideTransition(
+ position: animation.drive(tween),
+ child: FadeTransition(opacity: animation, child: child),
+ );
+ }
+}
+
+class _TestTransitionRoute<T> extends PageRoute<T> {
_TestTransitionRoute({
- required super.builder,
+ required this.builder,
required this.pageTransitionsBuilder,
this.transitionDurationOverride,
this.reverseTransitionDurationOverride,
});
+ final WidgetBuilder builder;
final PageTransitionsBuilder pageTransitionsBuilder;
final Duration? transitionDurationOverride;
final Duration? reverseTransitionDurationOverride;
@override
+ Widget buildPage(
+ BuildContext context,
+ Animation<double> animation,
+ Animation<double> secondaryAnimation,
+ ) {
+ return builder(context);
+ }
+
+ @override
Widget buildTransitions(
BuildContext context,
Animation<double> animation,
@@ -254,6 +305,15 @@
}
@override
+ Color? get barrierColor => null;
+
+ @override
+ String? get barrierLabel => null;
+
+ @override
+ bool get maintainState => true;
+
+ @override
Duration get transitionDuration =>
transitionDurationOverride ?? pageTransitionsBuilder.transitionDuration;
@override
diff --git a/packages/flutter_test/test/semantics_finder_test.dart b/packages/flutter_test/test/semantics_finder_test.dart
index d64b619..06253b4 100644
--- a/packages/flutter_test/test/semantics_finder_test.dart
+++ b/packages/flutter_test/test/semantics_finder_test.dart
@@ -4,7 +4,7 @@
import 'dart:ui';
-import 'package:flutter/material.dart';
+import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart';
import 'multi_view_testing.dart';
diff --git a/packages/flutter_test/test/test_text_input_test.dart b/packages/flutter_test/test/test_text_input_test.dart
index 4223d18..56778e4 100644
--- a/packages/flutter_test/test/test_text_input_test.dart
+++ b/packages/flutter_test/test/test_text_input_test.dart
@@ -8,29 +8,8 @@
import 'package:flutter_test/flutter_test.dart';
void main() {
- PageRoute<T> defaultPageRouteBuilder<T>(RouteSettings settings, WidgetBuilder builder) {
- return PageRouteBuilder<T>(
- settings: settings,
- pageBuilder:
- (
- BuildContext context,
- Animation<double> animation,
- Animation<double> secondaryAnimation,
- ) => builder(context),
- transitionsBuilder:
- (
- BuildContext context,
- Animation<double> animation,
- Animation<double> secondaryAnimation,
- Widget child,
- ) => child,
- );
- }
-
Widget buildTestApp({required TextEditingController controller, required FocusNode focusNode}) {
- return WidgetsApp(
- color: const Color(0xFFFFFFFF),
- pageRouteBuilder: defaultPageRouteBuilder,
+ return TestWidgetsApp(
home: SizedBox.expand(
child: Center(
child: EditableText(
diff --git a/packages/flutter_test/test/utils/memory_leak_tests.dart b/packages/flutter_test/test/utils/memory_leak_tests.dart
index 055304e..024795b 100644
--- a/packages/flutter_test/test/utils/memory_leak_tests.dart
+++ b/packages/flutter_test/test/utils/memory_leak_tests.dart
@@ -2,8 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'package:flutter/cupertino.dart';
-import 'package:flutter/material.dart';
+import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart';
diff --git a/packages/flutter_test/test/widget_tester_live_device_test.dart b/packages/flutter_test/test/widget_tester_live_device_test.dart
index 936b541..937f18e 100644
--- a/packages/flutter_test/test/widget_tester_live_device_test.dart
+++ b/packages/flutter_test/test/widget_tester_live_device_test.dart
@@ -3,8 +3,8 @@
// found in the LICENSE file.
import 'package:flutter/foundation.dart';
-import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
+import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart';
// Only check the initial lines of the message, since the message walks the
diff --git a/packages/flutter_test/test_fixes/flutter_test/animation_sheet_builder.dart b/packages/flutter_test/test_fixes/flutter_test/animation_sheet_builder.dart
index 27710c6..c929745 100644
--- a/packages/flutter_test/test_fixes/flutter_test/animation_sheet_builder.dart
+++ b/packages/flutter_test/test_fixes/flutter_test/animation_sheet_builder.dart
@@ -2,7 +2,7 @@
// 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/widgets.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
diff --git a/packages/flutter_test/test_fixes/flutter_test/animation_sheet_builder.dart.expect b/packages/flutter_test/test_fixes/flutter_test/animation_sheet_builder.dart.expect
index 5375732..b4c36e9 100644
--- a/packages/flutter_test/test_fixes/flutter_test/animation_sheet_builder.dart.expect
+++ b/packages/flutter_test/test_fixes/flutter_test/animation_sheet_builder.dart.expect
@@ -2,7 +2,7 @@
// 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/widgets.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
diff --git a/packages/flutter_test/test_fixes/flutter_test/matchers.dart b/packages/flutter_test/test_fixes/flutter_test/matchers.dart
index faafd10..9c197c7e 100644
--- a/packages/flutter_test/test_fixes/flutter_test/matchers.dart
+++ b/packages/flutter_test/test_fixes/flutter_test/matchers.dart
@@ -2,7 +2,7 @@
// 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/widgets.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
diff --git a/packages/flutter_test/test_fixes/flutter_test/matchers.dart.expect b/packages/flutter_test/test_fixes/flutter_test/matchers.dart.expect
index 6ee96f1..495dbba 100644
--- a/packages/flutter_test/test_fixes/flutter_test/matchers.dart.expect
+++ b/packages/flutter_test/test_fixes/flutter_test/matchers.dart.expect
@@ -2,7 +2,7 @@
// 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/widgets.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {