From 245d1b51ce033b9697d1e894272f4cc97d62f14b Mon Sep 17 00:00:00 2001 From: Greg Spencer Date: Tue, 26 Nov 2019 18:32:34 -0800 Subject: [PATCH] Add macOS to TargetPlatform (#43457) This PR adds TargetPlatform.macOS to the TargetPlatform enum. This allows us to begin implementation of some adaptive UI based on which target platform is desired. I haven't updated the tests here, that will come in a follow-up PR. --- dev/manual_tests/lib/actions.dart | 12 ++++++++---- dev/manual_tests/lib/animated_icons.dart | 13 +++++++++---- dev/manual_tests/lib/drag_and_drop.dart | 12 ++++++++---- dev/manual_tests/lib/focus.dart | 12 ++++++++---- dev/manual_tests/lib/hover.dart | 12 ++++++++---- dev/manual_tests/lib/main.dart | 12 ++++++++---- dev/manual_tests/lib/material_arc.dart | 12 ++++++++---- dev/manual_tests/lib/overlay_geometry.dart | 12 ++++++++---- dev/manual_tests/lib/page_view.dart | 13 +++++++++---- dev/manual_tests/lib/raw_keyboard.dart | 12 ++++++++---- dev/manual_tests/lib/text.dart | 12 ++++++++---- .../lib/demo/material/drawer_demo.dart | 1 + examples/flutter_gallery/lib/gallery/options.dart | 2 ++ examples/flutter_gallery/lib/main.dart | 6 +++++- packages/flutter/lib/src/cupertino/picker.dart | 1 + packages/flutter/lib/src/cupertino/switch.dart | 3 ++- .../flutter/lib/src/foundation/_platform_io.dart | 2 ++ packages/flutter/lib/src/foundation/binding.dart | 3 +++ packages/flutter/lib/src/foundation/platform.dart | 3 +++ packages/flutter/lib/src/material/app.dart | 1 + packages/flutter/lib/src/material/app_bar.dart | 2 ++ packages/flutter/lib/src/material/back_button.dart | 1 + packages/flutter/lib/src/material/bottom_sheet.dart | 1 + packages/flutter/lib/src/material/date_picker.dart | 1 + packages/flutter/lib/src/material/dialog.dart | 2 ++ packages/flutter/lib/src/material/drawer.dart | 2 ++ .../lib/src/material/flexible_space_bar.dart | 5 ++++- .../lib/src/material/page_transitions_theme.dart | 7 ++++--- packages/flutter/lib/src/material/popup_menu.dart | 2 ++ packages/flutter/lib/src/material/scaffold.dart | 1 + packages/flutter/lib/src/material/scrollbar.dart | 1 + packages/flutter/lib/src/material/search.dart | 1 + .../flutter/lib/src/material/selectable_text.dart | 5 +++++ packages/flutter/lib/src/material/slider.dart | 4 +++- packages/flutter/lib/src/material/switch.dart | 1 + packages/flutter/lib/src/material/text_field.dart | 5 +++++ packages/flutter/lib/src/material/theme_data.dart | 7 ++++--- packages/flutter/lib/src/material/time_picker.dart | 3 +++ packages/flutter/lib/src/material/typography.dart | 10 ++++++---- packages/flutter/lib/src/rendering/editable.dart | 2 ++ packages/flutter/lib/src/rendering/view.dart | 3 ++- packages/flutter/lib/src/widgets/modal_barrier.dart | 1 + packages/flutter/lib/src/widgets/routes.dart | 7 ++++--- .../lib/src/widgets/scroll_configuration.dart | 2 ++ .../test/widgets/sliver_fill_remaining_test.dart | 1 + packages/flutter_tools/lib/src/commands/create.dart | 3 ++- .../flutter_tools/templates/app/lib/main.dart.tmpl | 2 +- 47 files changed, 174 insertions(+), 64 deletions(-) diff --git a/dev/manual_tests/lib/actions.dart b/dev/manual_tests/lib/actions.dart index 142900969c5..99ed1b8c73d 100644 --- a/dev/manual_tests/lib/actions.dart +++ b/dev/manual_tests/lib/actions.dart @@ -8,13 +8,17 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; -void main() { - if (!kIsWeb && Platform.isMacOS) { - // TODO(gspencergoog): Update this when TargetPlatform includes macOS. https://github.com/flutter/flutter/issues/31366 - // See https://github.com/flutter/flutter/wiki/Desktop-shells#target-platform-override +// Sets a platform override for desktop to avoid exceptions. See +// https://flutter.dev/desktop#target-platform-override for more info. +// TODO(gspencergoog): Remove once TargetPlatform includes all desktop platforms. +void _enablePlatformOverrideForDesktop() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux)) { debugDefaultTargetPlatformOverride = TargetPlatform.fuchsia; } +} +void main() { + _enablePlatformOverrideForDesktop(); runApp(const MaterialApp( title: 'Actions Demo', home: FocusDemo(), diff --git a/dev/manual_tests/lib/animated_icons.dart b/dev/manual_tests/lib/animated_icons.dart index 43942829816..1b4781eb8f2 100644 --- a/dev/manual_tests/lib/animated_icons.dart +++ b/dev/manual_tests/lib/animated_icons.dart @@ -108,11 +108,16 @@ class IconSample { final String description; } -void main() { - if (!kIsWeb && Platform.isMacOS) { - // TODO(gspencergoog): Update this when TargetPlatform includes macOS. https://github.com/flutter/flutter/issues/31366 - // See https://github.com/flutter/flutter/wiki/Desktop-shells#target-platform-override +// Sets a platform override for desktop to avoid exceptions. See +// https://flutter.dev/desktop#target-platform-override for more info. +// TODO(gspencergoog): Remove once TargetPlatform includes all desktop platforms. +void _enablePlatformOverrideForDesktop() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux)) { debugDefaultTargetPlatformOverride = TargetPlatform.fuchsia; } +} + +void main() { + _enablePlatformOverrideForDesktop(); runApp(AnimatedIconsTestApp()); } diff --git a/dev/manual_tests/lib/drag_and_drop.dart b/dev/manual_tests/lib/drag_and_drop.dart index 2d5713e80a7..777d561cd42 100644 --- a/dev/manual_tests/lib/drag_and_drop.dart +++ b/dev/manual_tests/lib/drag_and_drop.dart @@ -296,13 +296,17 @@ class DragAndDropAppState extends State { } } -void main() { - if (!kIsWeb && Platform.isMacOS) { - // TODO(gspencergoog): Update this when TargetPlatform includes macOS. https://github.com/flutter/flutter/issues/31366 - // See https://github.com/flutter/flutter/wiki/Desktop-shells#target-platform-override +// Sets a platform override for desktop to avoid exceptions. See +// https://flutter.dev/desktop#target-platform-override for more info. +// TODO(gspencergoog): Remove once TargetPlatform includes all desktop platforms. +void _enablePlatformOverrideForDesktop() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux)) { debugDefaultTargetPlatformOverride = TargetPlatform.fuchsia; } +} +void main() { + _enablePlatformOverrideForDesktop(); runApp(MaterialApp( title: 'Drag and Drop Flutter Demo', home: DragAndDropApp(), diff --git a/dev/manual_tests/lib/focus.dart b/dev/manual_tests/lib/focus.dart index 36e525594d6..fa8816e285e 100644 --- a/dev/manual_tests/lib/focus.dart +++ b/dev/manual_tests/lib/focus.dart @@ -8,13 +8,17 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; -void main() { - if (!kIsWeb && Platform.isMacOS) { - // TODO(gspencergoog): Update this when TargetPlatform includes macOS. https://github.com/flutter/flutter/issues/31366 - // See https://github.com/flutter/flutter/wiki/Desktop-shells#target-platform-override +// Sets a platform override for desktop to avoid exceptions. See +// https://flutter.dev/desktop#target-platform-override for more info. +// TODO(gspencergoog): Remove once TargetPlatform includes all desktop platforms. +void _enablePlatformOverrideForDesktop() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux)) { debugDefaultTargetPlatformOverride = TargetPlatform.fuchsia; } +} +void main() { + _enablePlatformOverrideForDesktop(); runApp(const MaterialApp( title: 'Focus Demo', home: FocusDemo(), diff --git a/dev/manual_tests/lib/hover.dart b/dev/manual_tests/lib/hover.dart index bf82fa20318..b23e950d2f3 100644 --- a/dev/manual_tests/lib/hover.dart +++ b/dev/manual_tests/lib/hover.dart @@ -8,13 +8,17 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; -void main() { - if (!kIsWeb && Platform.isMacOS) { - // TODO(gspencergoog): Update this when TargetPlatform includes macOS. https://github.com/flutter/flutter/issues/31366 - // See https://github.com/flutter/flutter/wiki/Desktop-shells#target-platform-override +// Sets a platform override for desktop to avoid exceptions. See +// https://flutter.dev/desktop#target-platform-override for more info. +// TODO(gspencergoog): Remove once TargetPlatform includes all desktop platforms. +void _enablePlatformOverrideForDesktop() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux)) { debugDefaultTargetPlatformOverride = TargetPlatform.fuchsia; } +} +void main() { + _enablePlatformOverrideForDesktop(); runApp(const MaterialApp( title: 'Hover Demo', home: HoverDemo(), diff --git a/dev/manual_tests/lib/main.dart b/dev/manual_tests/lib/main.dart index 36881756351..de585eb7b4c 100644 --- a/dev/manual_tests/lib/main.dart +++ b/dev/manual_tests/lib/main.dart @@ -7,13 +7,17 @@ import 'dart:io'; import 'package:flutter/foundation.dart'; import 'package:flutter/widgets.dart'; -void main() { - if (!kIsWeb && Platform.isMacOS) { - // TODO(gspencergoog): Update this when TargetPlatform includes macOS. https://github.com/flutter/flutter/issues/31366 - // See https://github.com/flutter/flutter/wiki/Desktop-shells#target-platform-override +// Sets a platform override for desktop to avoid exceptions. See +// https://flutter.dev/desktop#target-platform-override for more info. +// TODO(gspencergoog): Remove once TargetPlatform includes all desktop platforms. +void _enablePlatformOverrideForDesktop() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux)) { debugDefaultTargetPlatformOverride = TargetPlatform.fuchsia; } +} +void main() { + _enablePlatformOverrideForDesktop(); runApp(const Directionality( textDirection: TextDirection.ltr, child: Center( diff --git a/dev/manual_tests/lib/material_arc.dart b/dev/manual_tests/lib/material_arc.dart index ee32036bd98..fc21d2d36b2 100644 --- a/dev/manual_tests/lib/material_arc.dart +++ b/dev/manual_tests/lib/material_arc.dart @@ -475,13 +475,17 @@ class _AnimationDemoState extends State with TickerProviderStateM } } -void main() { - if (!kIsWeb && Platform.isMacOS) { - // TODO(gspencergoog): Update this when TargetPlatform includes macOS. https://github.com/flutter/flutter/issues/31366 - // See https://github.com/flutter/flutter/wiki/Desktop-shells#target-platform-override +// Sets a platform override for desktop to avoid exceptions. See +// https://flutter.dev/desktop#target-platform-override for more info. +// TODO(gspencergoog): Remove once TargetPlatform includes all desktop platforms. +void _enablePlatformOverrideForDesktop() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux)) { debugDefaultTargetPlatformOverride = TargetPlatform.fuchsia; } +} +void main() { + _enablePlatformOverrideForDesktop(); runApp(const MaterialApp( home: AnimationDemo(), )); diff --git a/dev/manual_tests/lib/overlay_geometry.dart b/dev/manual_tests/lib/overlay_geometry.dart index 84caa7d8ed8..d05ba18ec51 100644 --- a/dev/manual_tests/lib/overlay_geometry.dart +++ b/dev/manual_tests/lib/overlay_geometry.dart @@ -206,13 +206,17 @@ class OverlayGeometryAppState extends State { } } -void main() { - if (!kIsWeb && Platform.isMacOS) { - // TODO(gspencergoog): Update this when TargetPlatform includes macOS. https://github.com/flutter/flutter/issues/31366 - // See https://github.com/flutter/flutter/wiki/Desktop-shells#target-platform-override +// Sets a platform override for desktop to avoid exceptions. See +// https://flutter.dev/desktop#target-platform-override for more info. +// TODO(gspencergoog): Remove once TargetPlatform includes all desktop platforms. +void _enablePlatformOverrideForDesktop() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux)) { debugDefaultTargetPlatformOverride = TargetPlatform.fuchsia; } +} +void main() { + _enablePlatformOverrideForDesktop(); runApp(MaterialApp( theme: ThemeData( brightness: Brightness.light, diff --git a/dev/manual_tests/lib/page_view.dart b/dev/manual_tests/lib/page_view.dart index 4a9d16c1af4..7f896805d45 100644 --- a/dev/manual_tests/lib/page_view.dart +++ b/dev/manual_tests/lib/page_view.dart @@ -141,12 +141,17 @@ class PageViewAppState extends State { } } -void main() { - if (!kIsWeb && Platform.isMacOS) { - // TODO(gspencergoog): Update this when TargetPlatform includes macOS. https://github.com/flutter/flutter/issues/31366 - // See https://github.com/flutter/flutter/wiki/Desktop-shells#target-platform-override +// Sets a platform override for desktop to avoid exceptions. See +// https://flutter.dev/desktop#target-platform-override for more info. +// TODO(gspencergoog): Remove once TargetPlatform includes all desktop platforms. +void _enablePlatformOverrideForDesktop() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux)) { debugDefaultTargetPlatformOverride = TargetPlatform.fuchsia; } +} + +void main() { + _enablePlatformOverrideForDesktop(); runApp(MaterialApp( title: 'PageView', theme: ThemeData( diff --git a/dev/manual_tests/lib/raw_keyboard.dart b/dev/manual_tests/lib/raw_keyboard.dart index bc774e75017..7b43869ef32 100644 --- a/dev/manual_tests/lib/raw_keyboard.dart +++ b/dev/manual_tests/lib/raw_keyboard.dart @@ -8,13 +8,17 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -void main() { - if (!kIsWeb && Platform.isMacOS) { - // TODO(gspencergoog): Update this when TargetPlatform includes macOS. https://github.com/flutter/flutter/issues/31366 - // See https://github.com/flutter/flutter/wiki/Desktop-shells#target-platform-override +// Sets a platform override for desktop to avoid exceptions. See +// https://flutter.dev/desktop#target-platform-override for more info. +// TODO(gspencergoog): Remove once TargetPlatform includes all desktop platforms. +void _enablePlatformOverrideForDesktop() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux)) { debugDefaultTargetPlatformOverride = TargetPlatform.fuchsia; } +} +void main() { + _enablePlatformOverrideForDesktop(); runApp(MaterialApp( title: 'Hardware Key Demo', home: Scaffold( diff --git a/dev/manual_tests/lib/text.dart b/dev/manual_tests/lib/text.dart index 7e6e5992538..556488db12f 100644 --- a/dev/manual_tests/lib/text.dart +++ b/dev/manual_tests/lib/text.dart @@ -12,13 +12,17 @@ import 'package:flutter/scheduler.dart'; int seed = 0; -void main() { - if (!kIsWeb && Platform.isMacOS) { - // TODO(gspencergoog): Update this when TargetPlatform includes macOS. https://github.com/flutter/flutter/issues/31366 - // See https://github.com/flutter/flutter/wiki/Desktop-shells#target-platform-override +// Sets a platform override for desktop to avoid exceptions. See +// https://flutter.dev/desktop#target-platform-override for more info. +// TODO(gspencergoog): Remove once TargetPlatform includes all desktop platforms. +void _enablePlatformOverrideForDesktop() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux)) { debugDefaultTargetPlatformOverride = TargetPlatform.fuchsia; } +} +void main() { + _enablePlatformOverrideForDesktop(); runApp(MaterialApp( title: 'Text tester', home: const Home(), diff --git a/examples/flutter_gallery/lib/demo/material/drawer_demo.dart b/examples/flutter_gallery/lib/demo/material/drawer_demo.dart index 417b8c93b94..08f69d20f0a 100644 --- a/examples/flutter_gallery/lib/demo/material/drawer_demo.dart +++ b/examples/flutter_gallery/lib/demo/material/drawer_demo.dart @@ -64,6 +64,7 @@ class _DrawerDemoState extends State with TickerProviderStateMixin { case TargetPlatform.fuchsia: return Icons.arrow_back; case TargetPlatform.iOS: + case TargetPlatform.macOS: return Icons.arrow_back_ios; } assert(false); diff --git a/examples/flutter_gallery/lib/gallery/options.dart b/examples/flutter_gallery/lib/gallery/options.dart index 865e19f9f16..e1687befd9c 100644 --- a/examples/flutter_gallery/lib/gallery/options.dart +++ b/examples/flutter_gallery/lib/gallery/options.dart @@ -360,6 +360,8 @@ class _PlatformItem extends StatelessWidget { return 'Fuchsia'; case TargetPlatform.iOS: return 'Cupertino'; + case TargetPlatform.macOS: + return 'Material Desktop (macOS)'; } assert(false); return null; diff --git a/examples/flutter_gallery/lib/main.dart b/examples/flutter_gallery/lib/main.dart index 33f4e1cd25b..cb50e222493 100644 --- a/examples/flutter_gallery/lib/main.dart +++ b/examples/flutter_gallery/lib/main.dart @@ -14,8 +14,12 @@ import 'gallery/app.dart'; // Sets a platform override for desktop to avoid exceptions. See // https://flutter.dev/desktop#target-platform-override for more info. +// TODO(gspencergoog): Remove once TargetPlatform includes all desktop platforms. +// This is only included in the Gallery because Flutter's testing infrastructure +// uses the Gallery for various tests, and this allows us to test on desktop +// platforms that aren't yet supported in TargetPlatform. void _enablePlatformOverrideForDesktop() { - if (!kIsWeb && (Platform.isMacOS || Platform.isWindows || Platform.isLinux)) { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux)) { debugDefaultTargetPlatformOverride = TargetPlatform.fuchsia; } } diff --git a/packages/flutter/lib/src/cupertino/picker.dart b/packages/flutter/lib/src/cupertino/picker.dart index 0186f695fd9..6aabf028335 100644 --- a/packages/flutter/lib/src/cupertino/picker.dart +++ b/packages/flutter/lib/src/cupertino/picker.dart @@ -230,6 +230,7 @@ class _CupertinoPickerState extends State { break; case TargetPlatform.android: case TargetPlatform.fuchsia: + case TargetPlatform.macOS: hasSuitableHapticHardware = false; break; } diff --git a/packages/flutter/lib/src/cupertino/switch.dart b/packages/flutter/lib/src/cupertino/switch.dart index 61d616cffce..b5cb9e5aaf1 100644 --- a/packages/flutter/lib/src/cupertino/switch.dart +++ b/packages/flutter/lib/src/cupertino/switch.dart @@ -445,8 +445,9 @@ class _RenderCupertinoSwitch extends RenderConstrainedBox { case TargetPlatform.iOS: HapticFeedback.lightImpact(); break; - case TargetPlatform.fuchsia: case TargetPlatform.android: + case TargetPlatform.fuchsia: + case TargetPlatform.macOS: break; } } diff --git a/packages/flutter/lib/src/foundation/_platform_io.dart b/packages/flutter/lib/src/foundation/_platform_io.dart index 7726331ea1e..2b526085b58 100644 --- a/packages/flutter/lib/src/foundation/_platform_io.dart +++ b/packages/flutter/lib/src/foundation/_platform_io.dart @@ -11,6 +11,8 @@ platform.TargetPlatform get defaultTargetPlatform { platform.TargetPlatform result; if (Platform.isIOS) { result = platform.TargetPlatform.iOS; + } else if (Platform.isMacOS) { + result = platform.TargetPlatform.macOS; } else if (Platform.isAndroid) { result = platform.TargetPlatform.android; } else if (Platform.isFuchsia) { diff --git a/packages/flutter/lib/src/foundation/binding.dart b/packages/flutter/lib/src/foundation/binding.dart index dd85335c0b4..2bf607e3836 100644 --- a/packages/flutter/lib/src/foundation/binding.dart +++ b/packages/flutter/lib/src/foundation/binding.dart @@ -163,6 +163,9 @@ abstract class BindingBase { case 'iOS': debugDefaultTargetPlatformOverride = TargetPlatform.iOS; break; + case 'macOS': + debugDefaultTargetPlatformOverride = TargetPlatform.macOS; + break; case 'fuchsia': debugDefaultTargetPlatformOverride = TargetPlatform.fuchsia; break; diff --git a/packages/flutter/lib/src/foundation/platform.dart b/packages/flutter/lib/src/foundation/platform.dart index 908bf3e339e..e23903679ae 100644 --- a/packages/flutter/lib/src/foundation/platform.dart +++ b/packages/flutter/lib/src/foundation/platform.dart @@ -47,6 +47,9 @@ enum TargetPlatform { /// iOS: iOS, + + /// macOS: + macOS, } /// Override the [defaultTargetPlatform]. diff --git a/packages/flutter/lib/src/material/app.dart b/packages/flutter/lib/src/material/app.dart index e4e64007286..7bf6ba320ff 100644 --- a/packages/flutter/lib/src/material/app.dart +++ b/packages/flutter/lib/src/material/app.dart @@ -481,6 +481,7 @@ class _MaterialScrollBehavior extends ScrollBehavior { // the base class as well. switch (getPlatform(context)) { case TargetPlatform.iOS: + case TargetPlatform.macOS: return child; case TargetPlatform.android: case TargetPlatform.fuchsia: diff --git a/packages/flutter/lib/src/material/app_bar.dart b/packages/flutter/lib/src/material/app_bar.dart index 0fee5ed7198..ed0f17cc713 100644 --- a/packages/flutter/lib/src/material/app_bar.dart +++ b/packages/flutter/lib/src/material/app_bar.dart @@ -393,6 +393,7 @@ class AppBar extends StatefulWidget implements PreferredSizeWidget { case TargetPlatform.fuchsia: return false; case TargetPlatform.iOS: + case TargetPlatform.macOS: return actions == null || actions.length < 2; } return null; @@ -483,6 +484,7 @@ class _AppBarState extends State { namesRoute = true; break; case TargetPlatform.iOS: + case TargetPlatform.macOS: break; } title = DefaultTextStyle( diff --git a/packages/flutter/lib/src/material/back_button.dart b/packages/flutter/lib/src/material/back_button.dart index 956220a8f08..17a699ca332 100644 --- a/packages/flutter/lib/src/material/back_button.dart +++ b/packages/flutter/lib/src/material/back_button.dart @@ -34,6 +34,7 @@ class BackButtonIcon extends StatelessWidget { case TargetPlatform.fuchsia: return Icons.arrow_back; case TargetPlatform.iOS: + case TargetPlatform.macOS: return Icons.arrow_back_ios; } assert(false); diff --git a/packages/flutter/lib/src/material/bottom_sheet.dart b/packages/flutter/lib/src/material/bottom_sheet.dart index 68869671c24..c50110ee600 100644 --- a/packages/flutter/lib/src/material/bottom_sheet.dart +++ b/packages/flutter/lib/src/material/bottom_sheet.dart @@ -283,6 +283,7 @@ class _ModalBottomSheetState extends State<_ModalBottomSheet> { String _getRouteLabel(MaterialLocalizations localizations) { switch (Theme.of(context).platform) { case TargetPlatform.iOS: + case TargetPlatform.macOS: return ''; case TargetPlatform.android: case TargetPlatform.fuchsia: diff --git a/packages/flutter/lib/src/material/date_picker.dart b/packages/flutter/lib/src/material/date_picker.dart index 32e45e67ce8..634bab9e107 100644 --- a/packages/flutter/lib/src/material/date_picker.dart +++ b/packages/flutter/lib/src/material/date_picker.dart @@ -911,6 +911,7 @@ class _DatePickerDialogState extends State<_DatePickerDialog> { HapticFeedback.vibrate(); break; case TargetPlatform.iOS: + case TargetPlatform.macOS: break; } } diff --git a/packages/flutter/lib/src/material/dialog.dart b/packages/flutter/lib/src/material/dialog.dart index f6551f036c9..c42e6f49b92 100644 --- a/packages/flutter/lib/src/material/dialog.dart +++ b/packages/flutter/lib/src/material/dialog.dart @@ -314,6 +314,7 @@ class AlertDialog extends StatelessWidget { if (title == null) { switch (theme.platform) { case TargetPlatform.iOS: + case TargetPlatform.macOS: label = semanticLabel; break; case TargetPlatform.android: @@ -591,6 +592,7 @@ class SimpleDialog extends StatelessWidget { String label = semanticLabel; if (title == null) { switch (theme.platform) { + case TargetPlatform.macOS: case TargetPlatform.iOS: label = semanticLabel; break; diff --git a/packages/flutter/lib/src/material/drawer.dart b/packages/flutter/lib/src/material/drawer.dart index a1c4b0d0087..c5c603bf609 100644 --- a/packages/flutter/lib/src/material/drawer.dart +++ b/packages/flutter/lib/src/material/drawer.dart @@ -177,6 +177,7 @@ class Drawer extends StatelessWidget { String label = semanticLabel; switch (Theme.of(context).platform) { case TargetPlatform.iOS: + case TargetPlatform.macOS: label = semanticLabel; break; case TargetPlatform.android: @@ -523,6 +524,7 @@ class DrawerControllerState extends State with SingleTickerPro platformHasBackButton = true; break; case TargetPlatform.iOS: + case TargetPlatform.macOS: case TargetPlatform.fuchsia: platformHasBackButton = false; break; diff --git a/packages/flutter/lib/src/material/flexible_space_bar.dart b/packages/flutter/lib/src/material/flexible_space_bar.dart index 910e495528e..fbc8adfc395 100644 --- a/packages/flutter/lib/src/material/flexible_space_bar.dart +++ b/packages/flutter/lib/src/material/flexible_space_bar.dart @@ -166,7 +166,7 @@ class FlexibleSpaceBar extends StatefulWidget { /// Whether the title should be centered. /// /// By default this property is true if the current target platform - /// is [TargetPlatform.iOS], false otherwise. + /// is [TargetPlatform.iOS] or [TargetPlatform.macOS], false otherwise. final bool centerTitle; /// Collapse effect while scrolling. @@ -239,6 +239,7 @@ class _FlexibleSpaceBarState extends State { case TargetPlatform.fuchsia: return false; case TargetPlatform.iOS: + case TargetPlatform.macOS: return true; } return null; @@ -341,6 +342,7 @@ class _FlexibleSpaceBarState extends State { Widget title; switch (theme.platform) { case TargetPlatform.iOS: + case TargetPlatform.macOS: title = widget.title; break; case TargetPlatform.fuchsia: @@ -349,6 +351,7 @@ class _FlexibleSpaceBarState extends State { namesRoute: true, child: widget.title, ); + break; } // StretchMode.fadeTitle diff --git a/packages/flutter/lib/src/material/page_transitions_theme.dart b/packages/flutter/lib/src/material/page_transitions_theme.dart index 9caad1a34c6..8aa7f6446c4 100644 --- a/packages/flutter/lib/src/material/page_transitions_theme.dart +++ b/packages/flutter/lib/src/material/page_transitions_theme.dart @@ -486,14 +486,15 @@ class CupertinoPageTransitionsBuilder extends PageTransitionsBuilder { class PageTransitionsTheme extends Diagnosticable { /// Construct a PageTransitionsTheme. /// - /// By default the list of builders is: [FadeUpwardsPageTransitionsBuilder], - /// [CupertinoPageTransitionsBuilder] for [TargetPlatform.android] - /// and [TargetPlatform.iOS] respectively. + /// By default the list of builders is: [FadeUpwardsPageTransitionsBuilder] + /// for [TargetPlatform.android], and [CupertinoPageTransitionsBuilder] for + /// [TargetPlatform.iOS] and [TargetPlatform.macOS]. const PageTransitionsTheme({ Map builders }) : _builders = builders; static const Map _defaultBuilders = { TargetPlatform.android: FadeUpwardsPageTransitionsBuilder(), TargetPlatform.iOS: CupertinoPageTransitionsBuilder(), + TargetPlatform.macOS: CupertinoPageTransitionsBuilder(), }; /// The [PageTransitionsBuilder]s supported by this theme. diff --git a/packages/flutter/lib/src/material/popup_menu.dart b/packages/flutter/lib/src/material/popup_menu.dart index 79107c4f6aa..750e7c28730 100644 --- a/packages/flutter/lib/src/material/popup_menu.dart +++ b/packages/flutter/lib/src/material/popup_menu.dart @@ -830,6 +830,7 @@ Future showMenu({ String label = semanticLabel; switch (Theme.of(context).platform) { case TargetPlatform.iOS: + case TargetPlatform.macOS: label = semanticLabel; break; case TargetPlatform.android: @@ -1083,6 +1084,7 @@ class _PopupMenuButtonState extends State> { case TargetPlatform.fuchsia: return const Icon(Icons.more_vert); case TargetPlatform.iOS: + case TargetPlatform.macOS: return const Icon(Icons.more_horiz); } return null; diff --git a/packages/flutter/lib/src/material/scaffold.dart b/packages/flutter/lib/src/material/scaffold.dart index 91af53bba10..0aeb6e4ae4b 100644 --- a/packages/flutter/lib/src/material/scaffold.dart +++ b/packages/flutter/lib/src/material/scaffold.dart @@ -2299,6 +2299,7 @@ class ScaffoldState extends State with TickerProviderStateMixin { switch (themeData.platform) { case TargetPlatform.iOS: + case TargetPlatform.macOS: _addIfNonNull( children, GestureDetector( diff --git a/packages/flutter/lib/src/material/scrollbar.dart b/packages/flutter/lib/src/material/scrollbar.dart index 23142422d04..a47c94b436d 100644 --- a/packages/flutter/lib/src/material/scrollbar.dart +++ b/packages/flutter/lib/src/material/scrollbar.dart @@ -86,6 +86,7 @@ class _ScrollbarState extends State with TickerProviderStateMixin { final ThemeData theme = Theme.of(context); switch (theme.platform) { case TargetPlatform.iOS: + case TargetPlatform.macOS: // On iOS, stop all local animations. CupertinoScrollbar has its own // animations. _fadeoutTimer?.cancel(); diff --git a/packages/flutter/lib/src/material/search.dart b/packages/flutter/lib/src/material/search.dart index 1fa2bfc22c9..b84a708a9df 100644 --- a/packages/flutter/lib/src/material/search.dart +++ b/packages/flutter/lib/src/material/search.dart @@ -487,6 +487,7 @@ class _SearchPageState extends State<_SearchPage> { String routeName; switch (theme.platform) { case TargetPlatform.iOS: + case TargetPlatform.macOS: routeName = ''; break; case TargetPlatform.android: diff --git a/packages/flutter/lib/src/material/selectable_text.dart b/packages/flutter/lib/src/material/selectable_text.dart index 169b3d53875..e70f8cf4110 100644 --- a/packages/flutter/lib/src/material/selectable_text.dart +++ b/packages/flutter/lib/src/material/selectable_text.dart @@ -70,6 +70,7 @@ class _SelectableTextSelectionGestureDetectorBuilder extends TextSelectionGestur if (delegate.selectionEnabled) { switch (Theme.of(_state.context).platform) { case TargetPlatform.iOS: + case TargetPlatform.macOS: renderEditable.selectPositionAt( from: details.globalPosition, cause: SelectionChangedCause.longPress, @@ -93,6 +94,7 @@ class _SelectableTextSelectionGestureDetectorBuilder extends TextSelectionGestur if (delegate.selectionEnabled) { switch (Theme.of(_state.context).platform) { case TargetPlatform.iOS: + case TargetPlatform.macOS: renderEditable.selectWordEdge(cause: SelectionChangedCause.tap); break; case TargetPlatform.android: @@ -110,6 +112,7 @@ class _SelectableTextSelectionGestureDetectorBuilder extends TextSelectionGestur if (delegate.selectionEnabled) { switch (Theme.of(_state.context).platform) { case TargetPlatform.iOS: + case TargetPlatform.macOS: renderEditable.selectPositionAt( from: details.globalPosition, cause: SelectionChangedCause.longPress, @@ -462,6 +465,7 @@ class _SelectableTextState extends State with AutomaticKeepAlive switch (Theme.of(context).platform) { case TargetPlatform.iOS: + case TargetPlatform.macOS: if (cause == SelectionChangedCause.longPress) { _editableText?.bringIntoView(selection.base); } @@ -529,6 +533,7 @@ class _SelectableTextState extends State with AutomaticKeepAlive switch (themeData.platform) { case TargetPlatform.iOS: + case TargetPlatform.macOS: forcePressEnabled = true; textSelectionControls = cupertinoTextSelectionControls; paintCursorAboveText = true; diff --git a/packages/flutter/lib/src/material/slider.dart b/packages/flutter/lib/src/material/slider.dart index 025b68833db..955ed63b53c 100644 --- a/packages/flutter/lib/src/material/slider.dart +++ b/packages/flutter/lib/src/material/slider.dart @@ -502,6 +502,7 @@ class _SliderState extends State with TickerProviderStateMixin { case TargetPlatform.fuchsia: return _buildMaterialSlider(context); case TargetPlatform.iOS: + case TargetPlatform.macOS: return _buildCupertinoSlider(context); } } @@ -888,14 +889,15 @@ class _RenderSlider extends RenderBox with RelayoutWhenSystemFontsChangeMixin { double get _adjustmentUnit { switch (_platform) { case TargetPlatform.iOS: + case TargetPlatform.macOS: // Matches iOS implementation of material slider. return 0.1; case TargetPlatform.android: case TargetPlatform.fuchsia: - default: // Matches Android implementation of material slider. return 0.05; } + return 0.0; } void _updateLabelPainter() { diff --git a/packages/flutter/lib/src/material/switch.dart b/packages/flutter/lib/src/material/switch.dart index d4168d48e2d..466f835d1e7 100644 --- a/packages/flutter/lib/src/material/switch.dart +++ b/packages/flutter/lib/src/material/switch.dart @@ -354,6 +354,7 @@ class _SwitchState extends State with TickerProviderStateMixin { case TargetPlatform.fuchsia: return buildMaterialSwitch(context); case TargetPlatform.iOS: + case TargetPlatform.macOS: return buildCupertinoSwitch(context); } } diff --git a/packages/flutter/lib/src/material/text_field.dart b/packages/flutter/lib/src/material/text_field.dart index efc1cef30d2..c9047c90c49 100644 --- a/packages/flutter/lib/src/material/text_field.dart +++ b/packages/flutter/lib/src/material/text_field.dart @@ -59,6 +59,7 @@ class _TextFieldSelectionGestureDetectorBuilder extends TextSelectionGestureDete if (delegate.selectionEnabled) { switch (Theme.of(_state.context).platform) { case TargetPlatform.iOS: + case TargetPlatform.macOS: renderEditable.selectPositionAt( from: details.globalPosition, cause: SelectionChangedCause.longPress, @@ -82,6 +83,7 @@ class _TextFieldSelectionGestureDetectorBuilder extends TextSelectionGestureDete if (delegate.selectionEnabled) { switch (Theme.of(_state.context).platform) { case TargetPlatform.iOS: + case TargetPlatform.macOS: renderEditable.selectWordEdge(cause: SelectionChangedCause.tap); break; case TargetPlatform.android: @@ -100,6 +102,7 @@ class _TextFieldSelectionGestureDetectorBuilder extends TextSelectionGestureDete if (delegate.selectionEnabled) { switch (Theme.of(_state.context).platform) { case TargetPlatform.iOS: + case TargetPlatform.macOS: renderEditable.selectPositionAt( from: details.globalPosition, cause: SelectionChangedCause.longPress, @@ -868,6 +871,7 @@ class _TextFieldState extends State implements TextSelectionGestureDe switch (Theme.of(context).platform) { case TargetPlatform.iOS: + case TargetPlatform.macOS: if (cause == SelectionChangedCause.longPress) { _editableText?.bringIntoView(selection.base); } @@ -923,6 +927,7 @@ class _TextFieldState extends State implements TextSelectionGestureDe switch (themeData.platform) { case TargetPlatform.iOS: + case TargetPlatform.macOS: forcePressEnabled = true; textSelectionControls = cupertinoTextSelectionControls; paintCursorAboveText = true; diff --git a/packages/flutter/lib/src/material/theme_data.dart b/packages/flutter/lib/src/material/theme_data.dart index 0c6ccb4f5a8..11ddaedf81c 100644 --- a/packages/flutter/lib/src/material/theme_data.dart +++ b/packages/flutter/lib/src/material/theme_data.dart @@ -873,9 +873,10 @@ class ThemeData extends Diagnosticable { /// In a test environment, the platform returned is [TargetPlatform.android] /// regardless of the host platform. (Android was chosen because the tests /// were originally written assuming Android-like behavior, and we added - /// platform adaptations for iOS later). Tests can check iOS behavior by - /// setting the [platform] of the [Theme] explicitly to [TargetPlatform.iOS], - /// or by setting [debugDefaultTargetPlatformOverride]. + /// platform adaptations for other platforms later). Tests can check behavior + /// for other platforms by setting the [platform] of the [Theme] explicitly to + /// another [TargetPlatform] value, or by setting + /// [debugDefaultTargetPlatformOverride]. final TargetPlatform platform; /// Configures the hit test size of certain Material widgets. diff --git a/packages/flutter/lib/src/material/time_picker.dart b/packages/flutter/lib/src/material/time_picker.dart index 6ee0ef9827a..73aa100d84e 100644 --- a/packages/flutter/lib/src/material/time_picker.dart +++ b/packages/flutter/lib/src/material/time_picker.dart @@ -209,6 +209,7 @@ class _DayPeriodControl extends StatelessWidget { _announceToAccessibility(context, MaterialLocalizations.of(context).anteMeridiemAbbreviation); break; case TargetPlatform.iOS: + case TargetPlatform.macOS: break; } _togglePeriod(); @@ -224,6 +225,7 @@ class _DayPeriodControl extends StatelessWidget { _announceToAccessibility(context, MaterialLocalizations.of(context).postMeridiemAbbreviation); break; case TargetPlatform.iOS: + case TargetPlatform.macOS: break; } _togglePeriod(); @@ -1525,6 +1527,7 @@ class _TimePickerDialogState extends State<_TimePickerDialog> { }); break; case TargetPlatform.iOS: + case TargetPlatform.macOS: break; } } diff --git a/packages/flutter/lib/src/material/typography.dart b/packages/flutter/lib/src/material/typography.dart index 47c28b23dd5..13c043608c5 100644 --- a/packages/flutter/lib/src/material/typography.dart +++ b/packages/flutter/lib/src/material/typography.dart @@ -88,10 +88,11 @@ enum ScriptCategory { class Typography extends Diagnosticable { /// Creates a typography instance. /// - /// If [platform] is [TargetPlatform.iOS], the default values for [black] and - /// [white] are [blackCupertino] and [whiteCupertino] respectively. Otherwise - /// they are [blackMountainView] and [whiteMoutainView]. If [platform] is - /// null then both [black] and [white] must be specified. + /// If [platform] is [TargetPlatform.iOS] or [TargetPlatform.macOS], the + /// default values for [black] and [white] are [blackCupertino] and + /// [whiteCupertino] respectively. Otherwise they are [blackMountainView] and + /// [whiteMoutainView]. If [platform] is null then both [black] and [white] + /// must be specified. /// /// The default values for [englishLike], [dense], and [tall] are /// [englishLike2014], [dense2014], and [tall2014]. @@ -106,6 +107,7 @@ class Typography extends Diagnosticable { assert(platform != null || (black != null && white != null)); switch (platform) { case TargetPlatform.iOS: + case TargetPlatform.macOS: black ??= blackCupertino; white ??= whiteCupertino; break; diff --git a/packages/flutter/lib/src/rendering/editable.dart b/packages/flutter/lib/src/rendering/editable.dart index ad7659802f9..d3afb1cd3f2 100644 --- a/packages/flutter/lib/src/rendering/editable.dart +++ b/packages/flutter/lib/src/rendering/editable.dart @@ -1719,6 +1719,7 @@ class RenderEditable extends RenderBox with RelayoutWhenSystemFontsChangeMixin { assert(defaultTargetPlatform != null); switch (defaultTargetPlatform) { case TargetPlatform.iOS: + case TargetPlatform.macOS: return Rect.fromLTWH(0.0, 0.0, cursorWidth, preferredLineHeight + 2); case TargetPlatform.android: case TargetPlatform.fuchsia: @@ -1777,6 +1778,7 @@ class RenderEditable extends RenderBox with RelayoutWhenSystemFontsChangeMixin { if (caretHeight != null) { switch (defaultTargetPlatform) { case TargetPlatform.iOS: + case TargetPlatform.macOS: final double heightDiff = caretHeight - caretRect.height; // Center the caret vertically along the text. caretRect = Rect.fromLTWH( diff --git a/packages/flutter/lib/src/rendering/view.dart b/packages/flutter/lib/src/rendering/view.dart index 2f301faf084..686dff261ea 100644 --- a/packages/flutter/lib/src/rendering/view.dart +++ b/packages/flutter/lib/src/rendering/view.dart @@ -253,8 +253,9 @@ class RenderView extends RenderObject with RenderObjectWithChildMixin case TargetPlatform.android: lowerOverlayStyle = layer.find(bottom); break; - case TargetPlatform.iOS: case TargetPlatform.fuchsia: + case TargetPlatform.iOS: + case TargetPlatform.macOS: break; } // If there are no overlay styles in the UI don't bother updating. diff --git a/packages/flutter/lib/src/widgets/modal_barrier.dart b/packages/flutter/lib/src/widgets/modal_barrier.dart index 14de51e77dc..5c0ad1cf7e1 100644 --- a/packages/flutter/lib/src/widgets/modal_barrier.dart +++ b/packages/flutter/lib/src/widgets/modal_barrier.dart @@ -82,6 +82,7 @@ class ModalBarrier extends StatelessWidget { platformSupportsDismissingBarrier = false; break; case TargetPlatform.iOS: + case TargetPlatform.macOS: platformSupportsDismissingBarrier = true; break; } diff --git a/packages/flutter/lib/src/widgets/routes.dart b/packages/flutter/lib/src/widgets/routes.dart index 63e8ff9734c..34f1ad360e5 100644 --- a/packages/flutter/lib/src/widgets/routes.dart +++ b/packages/flutter/lib/src/widgets/routes.dart @@ -1217,9 +1217,10 @@ abstract class ModalRoute extends TransitionRoute with LocalHistoryRoute