Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -33,20 +33,24 @@ class _ResizeAppState extends State<ResizeApp> {
mainAxisSize: MainAxisSize.min,
children: <Widget>[
for (int i = 0; i < _listSize; i++)
Container(color: HSVColor.fromAHSV(1, (10.0 * i), 1, 1).toColor(), height: 50, width: 200,
Container(
color: HSVColor.fromAHSV(1, (10.0 * i), 1, 1).toColor(),
height: 50,
width: 200,
child: Center(
child: Text(
'Flutter Widget $i',
style: const TextStyle(fontSize: 16, color: Colors.black),
),
)),
),
),
TextButton(
onPressed: _addToList,
child: Text('Listception!'),
)
),
],
),
),
);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,27 +21,30 @@ class MockCounterModel extends ChangeNotifier implements CounterModel {
}

void main() {
testWidgets('MiniView smoke test', (tester) async {
// Build our app and trigger a frame.
await tester.pumpWidget(
MaterialApp(
home: ChangeNotifierProvider<CounterModel>.value(
value: MockCounterModel(),
child: const Contents(),
testWidgets(
'MiniView smoke test',
(tester) async {
// Build our app and trigger a frame.
await tester.pumpWidget(
MaterialApp(
home: ChangeNotifierProvider<CounterModel>.value(
value: MockCounterModel(),
child: const Contents(),
),
),
),
);
);

// Verify that our counter starts at 0.
expect(find.text('Taps: 0'), findsOneWidget);
expect(find.text('Taps: 1'), findsNothing);
// Verify that our counter starts at 0.
expect(find.text('Taps: 0'), findsOneWidget);
expect(find.text('Taps: 1'), findsNothing);

// Tap the '+' icon and trigger a frame.
await tester.tap(find.text('Tap me!'));
await tester.pump();
// Tap the '+' icon and trigger a frame.
await tester.tap(find.text('Tap me!'));
await tester.pump();

// Verify that our counter has incremented.
expect(find.text('Taps: 0'), findsNothing);
expect(find.text('Taps: 1'), findsOneWidget);
});
// Verify that our counter has incremented.
expect(find.text('Taps: 0'), findsNothing);
expect(find.text('Taps: 1'), findsOneWidget);
},
);
}
3 changes: 2 additions & 1 deletion asset_transformation/grayscale_transformer/pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
name: grayscale_transformer
description: A sample command-line application.
version: 1.0.0
resolution: workspace

environment:
sdk: ^3.9.0-0
Expand All @@ -10,5 +11,5 @@ dependencies:
image: ^4.1.7

dev_dependencies:
lints: ^5.0.0
lints: ^6.0.0
test: ^1.24.0
2 changes: 1 addition & 1 deletion dynamic_theme/lib/widgets/message_widget.dart
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ class MessageWidget extends StatelessWidget {
child: Column(
children: [
if (text case final text?) MarkdownBody(data: text),
if (image case final image?) image,
?image,
],
),
),
Expand Down
2 changes: 1 addition & 1 deletion gemini_tasks/lib/widgets/message_widget.dart
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ class MessageWidget extends StatelessWidget {
child: Column(
children: [
if (text case final text?) MarkdownBody(data: text),
if (image case final image?) image,
?image,
],
),
),
Expand Down
199 changes: 0 additions & 199 deletions material_3_demo/test/component_screen_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -261,205 +261,6 @@ void main() {
expect(box.localToGlobal(Offset.zero), const Offset(0.0, 3080.0));
},
);

testWidgets(
'Material version switches between Material3 and Material2 when '
'the version icon is clicked',
(tester) async {
widgetSetup(tester, 450, windowHeight: 7000);
await tester.pumpWidget(const App());
BuildContext defaultElevatedButton = tester.firstElement(
find.byType(ElevatedButton),
);
BuildContext defaultIconButton = tester.firstElement(
find.byType(IconButton),
);
BuildContext defaultFAB = tester.firstElement(
find.byType(FloatingActionButton),
);
BuildContext defaultCard = tester.firstElement(
find.widgetWithText(Card, 'Elevated'),
);
BuildContext defaultChip = tester.firstElement(
find.widgetWithText(ActionChip, 'Assist'),
);
Finder dialog = find.text('Show dialog');
await tester.tap(dialog);
await tester.pumpAndSettle(const Duration(microseconds: 500));
BuildContext defaultAlertDialog = tester.element(
find.byType(AlertDialog),
);
expect(Theme.of(defaultAlertDialog).useMaterial3, true);
Finder dismiss = find.text('Okay');
await tester.tap(dismiss);
await tester.pumpAndSettle(const Duration(microseconds: 500));

expect(find.widgetWithIcon(AppBar, Icons.filter_2), findsOneWidget);
expect(find.widgetWithIcon(AppBar, Icons.filter_3), findsNothing);
expect(find.text('Material 3'), findsOneWidget);
expect(Theme.of(defaultElevatedButton).useMaterial3, true);
expect(Theme.of(defaultIconButton).useMaterial3, true);
expect(Theme.of(defaultFAB).useMaterial3, true);
expect(Theme.of(defaultCard).useMaterial3, true);
expect(Theme.of(defaultChip).useMaterial3, true);

Finder appbarM3Icon = find.descendant(
of: find.byType(AppBar),
matching: find.widgetWithIcon(IconButton, Icons.filter_2),
);
await tester.tap(appbarM3Icon);
await tester.pumpAndSettle(const Duration(microseconds: 500));
BuildContext updatedElevatedButton = tester.firstElement(
find.byType(ElevatedButton),
);
BuildContext updatedIconButton = tester.firstElement(
find.byType(IconButton),
);
BuildContext updatedFAB = tester.firstElement(
find.byType(FloatingActionButton),
);
BuildContext updatedCard = tester.firstElement(find.byType(Card));
BuildContext updatedChip = tester.firstElement(
find.widgetWithText(ActionChip, 'Assist'),
);
Finder updatedDialog = find.text('Show dialog');
await tester.tap(updatedDialog);
await tester.pumpAndSettle(const Duration(microseconds: 500));
BuildContext updatedAlertDialog = tester.firstElement(
find.byType(AlertDialog),
);
expect(Theme.of(updatedAlertDialog).useMaterial3, false);
Finder updatedDismiss = find.text('Dismiss');
await tester.tap(updatedDismiss);
await tester.pumpAndSettle(const Duration(microseconds: 500));

expect(find.widgetWithIcon(AppBar, Icons.filter_3), findsOneWidget);
expect(find.widgetWithIcon(AppBar, Icons.filter_2), findsNothing);
expect(find.text('Material 2'), findsOneWidget);
expect(Theme.of(updatedElevatedButton).useMaterial3, false);
expect(Theme.of(updatedIconButton).useMaterial3, false);
expect(Theme.of(updatedFAB).useMaterial3, false);
expect(Theme.of(updatedCard).useMaterial3, false);
expect(Theme.of(updatedChip).useMaterial3, false);
},
);

testWidgets(
'Other screens become Material2 mode after changing mode from '
'main screen',
(tester) async {
await tester.pumpWidget(const App());
Finder appbarM2Icon = find.descendant(
of: find.byType(AppBar),
matching: find.widgetWithIcon(IconButton, Icons.filter_2),
);
await tester.tap(appbarM2Icon);
Finder secondScreenIcon = find.descendant(
of: find.byType(NavigationBar),
matching: find.widgetWithIcon(
NavigationDestination,
Icons.format_paint_outlined,
),
);
await tester.tap(secondScreenIcon);
await tester.pumpAndSettle(const Duration(microseconds: 500));
BuildContext lightThemeText = tester.element(
find.text('Light ColorScheme'),
);
expect(Theme.of(lightThemeText).useMaterial3, false);
Finder thirdScreenIcon = find.descendant(
of: find.byType(NavigationBar),
matching: find.widgetWithIcon(
NavigationDestination,
Icons.text_snippet_outlined,
),
);
await tester.tap(thirdScreenIcon);
await tester.pumpAndSettle(const Duration(microseconds: 500));
BuildContext displayLargeText = tester.element(
find.text('Display Large'),
);
expect(Theme.of(displayLargeText).useMaterial3, false);
Finder fourthScreenIcon = find.descendant(
of: find.byType(NavigationBar),
matching: find.widgetWithIcon(
NavigationDestination,
Icons.invert_colors_on_outlined,
),
);
await tester.tap(fourthScreenIcon);
await tester.pumpAndSettle(const Duration(microseconds: 500));
BuildContext material = tester.firstElement(find.byType(Material));
expect(Theme.of(material).useMaterial3, false);
},
);

testWidgets('Brightness mode switches between dark and light when'
'the brightness icon is clicked', (tester) async {
await tester.pumpWidget(const App());
Finder lightIcon = find.descendant(
of: find.byType(AppBar),
matching: find.widgetWithIcon(IconButton, Icons.light_mode_outlined),
);
Finder darkIcon = find.descendant(
of: find.byType(AppBar),
matching: find.widgetWithIcon(IconButton, Icons.dark_mode_outlined),
);
BuildContext appBar = tester.element(find.byType(AppBar).first);
BuildContext body = tester.firstElement(find.byType(Scaffold).first);
BuildContext navigationRail = tester.element(
find.widgetWithIcon(NavigationRail, Icons.format_paint_outlined),
);
expect(darkIcon, findsOneWidget);
expect(lightIcon, findsNothing);
expect(Theme.of(appBar).brightness, Brightness.light);
expect(Theme.of(body).brightness, Brightness.light);
expect(Theme.of(navigationRail).brightness, Brightness.light);
await tester.tap(darkIcon);
await tester.pumpAndSettle(const Duration(microseconds: 500));

BuildContext appBar2 = tester.element(find.byType(AppBar).first);
BuildContext body2 = tester.element(find.byType(Scaffold).first);
BuildContext navigationRail2 = tester.element(
find.widgetWithIcon(NavigationRail, Icons.format_paint_outlined),
);

expect(darkIcon, findsNothing);
expect(lightIcon, findsOneWidget);
expect(Theme.of(appBar2).brightness, Brightness.dark);
expect(Theme.of(body2).brightness, Brightness.dark);
expect(Theme.of(navigationRail2).brightness, Brightness.dark);
});

testWidgets('Color theme changes when a color is selected from menu', (
tester,
) async {
Color m3BaseColor = const Color(0xff65558f);
await tester.pumpWidget(Container());
await tester.pumpWidget(const App());
await tester.pump();
Finder menuIcon = find.descendant(
of: find.byType(AppBar),
matching: find.widgetWithIcon(IconButton, Icons.palette_outlined),
);
BuildContext appBar = tester.element(
find.widgetWithIcon(AppBar, Icons.palette_outlined).first,
);
BuildContext body = tester.element(find.byType(Scaffold).first);

expect(Theme.of(appBar).primaryColor, m3BaseColor);
expect(Theme.of(body).primaryColor, m3BaseColor);
await tester.tap(menuIcon);
await tester.pumpAndSettle();
await tester.tap(find.text('Blue').last);
await tester.pumpAndSettle();

BuildContext appBar2 = tester.element(find.byType(AppBar).first);
BuildContext body2 = tester.element(find.byType(Scaffold).first);
ThemeData expectedTheme = ThemeData(colorSchemeSeed: Colors.blue);
expect(Theme.of(appBar2).primaryColor, expectedTheme.primaryColor);
expect(Theme.of(body2).primaryColor, expectedTheme.primaryColor);
});
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These tests are flaky and cause the process to hang. Also, they're testing something that we shouldn't really care about in 2026.

}

void widgetSetup(
Expand Down
10 changes: 10 additions & 0 deletions pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ workspace:
- android_splash_screen
- animations
- asset_transformation
- asset_transformation/grayscale_transformer
- background_isolate_channels
- code_sharing/client
- code_sharing/server
Expand Down Expand Up @@ -52,3 +53,12 @@ workspace:
- tool
- web_embedding/element_embedding_demo
- web_embedding/ng-flutter/flutter

skip_ci:
- add_to_app/android_view/flutter_module_using_plugin_android_view
- add_to_app/android_view/flutter_module_using_plugin_content_sizing_android_view
- add_to_app/books/flutter_module_books
- add_to_app/fullscreen/flutter_module_fullscreen
- add_to_app/multiple_flutters/multiple_flutters_module
- add_to_app/plugin/flutter_module_using_plugin
- add_to_app/prebuilt_module/flutter_module
7 changes: 6 additions & 1 deletion tool/ci_script.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,15 @@ Future<void> main() async {
exit(1);
}

final skipCiList = pubspecYaml['skip_ci'] as YamlList?;

// pub workspace, only run 'get' once
await _runCommand('flutter', ['pub', 'get'], workingDirectory: rootDir.path);

final packages = workspace.map((e) => e.toString()).toList();
final packages = workspace
.where((e) => skipCiList == null || !skipCiList.contains(e))
.map((e) => e.toString())
.toList();

for (final package in packages) {
final packagePath = path.join(rootDir.path, package);
Expand Down
Loading
Loading