From a29853144b3172e066cf818001e53ddcb55bd246 Mon Sep 17 00:00:00 2001 From: John Ryan Date: Mon, 28 Oct 2019 14:33:43 -0700 Subject: [PATCH] Update gallery, fix Cupertino fonts by using GoogleSans instead (#155) * Update gallery, fix Cupertino fonts Cupertino fonts fixed by using GoogleSans instead * remove BUILD.gn * remove ios and android dirs from web/gallery * remove meta/flutter_gallery.cmx * revert provider_shopper/pubspec.lock * remove gallery's test and tool directories * update web/gallery README --- web/gallery/.gitignore | 73 ----- web/gallery/.metadata | 10 - web/gallery/README.md | 29 +- web/gallery/analysis_options.yaml | 8 + web/gallery/assets/preview.png | Bin 22645 -> 0 bytes web/gallery/lib/demo/calculator/logic.dart | 5 +- web/gallery/lib/demo/colors_demo.dart | 2 +- web/gallery/lib/demo/contacts_demo.dart | 42 ++- .../demo/cupertino/cupertino_alert_demo.dart | 277 +++++++++--------- .../cupertino/cupertino_navigation_demo.dart | 22 +- .../lib/demo/fortnightly/fortnightly.dart | 2 +- .../lib/demo/material/backdrop_demo.dart | 2 +- .../lib/demo/material/banner_demo.dart | 4 +- .../demo/material/bottom_navigation_demo.dart | 7 +- web/gallery/lib/demo/material/cards_demo.dart | 142 +++++---- web/gallery/lib/demo/material/chip_demo.dart | 56 ++-- .../lib/demo/material/leave_behind_demo.dart | 12 +- .../lib/demo/material/search_demo.dart | 33 ++- .../lib/demo/material/snack_bar_demo.dart | 2 +- web/gallery/lib/demo/shrine/backdrop.dart | 71 ++++- web/gallery/lib/demo/typography_demo.dart | 10 +- web/gallery/lib/gallery/backdrop.dart | 201 ++++++------- web/gallery/lib/gallery/home.dart | 44 ++- web/gallery/lib/gallery/options.dart | 22 +- web/gallery/pubspec.lock | 64 +++- web/gallery/pubspec.yaml | 121 ++++++-- .../material/text_form_field_demo_test.dart | 60 ---- web/gallery/test/gallery_test.dart | 12 - web/gallery/web/index.html | 18 +- 29 files changed, 680 insertions(+), 671 deletions(-) delete mode 100644 web/gallery/.gitignore delete mode 100644 web/gallery/.metadata create mode 100644 web/gallery/analysis_options.yaml delete mode 100644 web/gallery/assets/preview.png delete mode 100644 web/gallery/test/demo/material/text_form_field_demo_test.dart delete mode 100644 web/gallery/test/gallery_test.dart diff --git a/web/gallery/.gitignore b/web/gallery/.gitignore deleted file mode 100644 index 2ddde2a5e..000000000 --- a/web/gallery/.gitignore +++ /dev/null @@ -1,73 +0,0 @@ -# Miscellaneous -*.class -*.log -*.pyc -*.swp -.DS_Store -.atom/ -.buildlog/ -.history -.svn/ - -# IntelliJ related -*.iml -*.ipr -*.iws -.idea/ - -# The .vscode folder contains launch configuration and tasks you configure in -# VS Code which you may wish to be included in version control, so this line -# is commented out by default. -#.vscode/ - -# Flutter/Dart/Pub related -**/doc/api/ -.dart_tool/ -.flutter-plugins -.packages -.pub-cache/ -.pub/ -/build/ - -# Android related -**/android/**/gradle-wrapper.jar -**/android/.gradle -**/android/captures/ -**/android/gradlew -**/android/gradlew.bat -**/android/local.properties -**/android/**/GeneratedPluginRegistrant.java - -# iOS/XCode related -**/ios/**/*.mode1v3 -**/ios/**/*.mode2v3 -**/ios/**/*.moved-aside -**/ios/**/*.pbxuser -**/ios/**/*.perspectivev3 -**/ios/**/*sync/ -**/ios/**/.sconsign.dblite -**/ios/**/.tags* -**/ios/**/.vagrant/ -**/ios/**/DerivedData/ -**/ios/**/Icon? -**/ios/**/Pods/ -**/ios/**/.symlinks/ -**/ios/**/profile -**/ios/**/xcuserdata -**/ios/.generated/ -**/ios/Flutter/App.framework -**/ios/Flutter/Flutter.framework -**/ios/Flutter/Generated.xcconfig -**/ios/Flutter/app.flx -**/ios/Flutter/app.zip -**/ios/Flutter/flutter_assets/ -**/ios/Flutter/flutter_export_environment.sh -**/ios/ServiceDefinitions.json -**/ios/Runner/GeneratedPluginRegistrant.* - -# Exceptions to above rules. -!**/ios/**/default.mode1v3 -!**/ios/**/default.mode2v3 -!**/ios/**/default.pbxuser -!**/ios/**/default.perspectivev3 -!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages diff --git a/web/gallery/.metadata b/web/gallery/.metadata deleted file mode 100644 index 412f5adaf..000000000 --- a/web/gallery/.metadata +++ /dev/null @@ -1,10 +0,0 @@ -# This file tracks properties of this Flutter project. -# Used by Flutter tool to assess capabilities and perform upgrades etc. -# -# This file should be version controlled and should not be manually edited. - -version: - revision: 393106fbf58124aef777fc12e97a20e237842f99 - channel: master - -project_type: app diff --git a/web/gallery/README.md b/web/gallery/README.md index 7d47cdc89..dd7014f05 100644 --- a/web/gallery/README.md +++ b/web/gallery/README.md @@ -1,5 +1,28 @@ -A gallery of Flutter widgets and UX studies. +# Flutter gallery -Original source on [GitHub][gallery]. +This is a copy of the [Flutter gallery] hosted at +[flutter.github.io/samples][hosted url]. -[gallery]: https://github.com/flutter/flutter/tree/master/examples/flutter_gallery +## Updating + +To update, copy the contents of the gallery directory, and remove the following +files and directories: + +```bash +rm BUILD.gn +rm -rf tool/ +rm -rf test/ +rm -rf android/ +rm -rf ios/ +``` + +If you changed the `pubspec.yaml` file, make sure to use Google Sans instead of +San Francisco (which is not available on the web) by copy-pasting the `fonts` +section from Google Sans: +- Use "GoogleSans" for ".SF Pro Text". +- Use "GoogleSansDisplay" for ".SF Pro Display" +- Use "GoogleSans" for ".SF UI Text" +- Use "GoogleSansDisplay" for ".SF UI Display". + +[Flutter gallery]: https://github.com/flutter/flutter/tree/master/examples/flutter_gallery +[hosted url]: https://flutter.github.io/samples/gallery/#/ diff --git a/web/gallery/analysis_options.yaml b/web/gallery/analysis_options.yaml new file mode 100644 index 000000000..44fbe83c0 --- /dev/null +++ b/web/gallery/analysis_options.yaml @@ -0,0 +1,8 @@ +# Take our settings from the repo's main analysis_options.yaml file, but add +# an exclude for the build directory. + +include: ../../analysis_options.yaml + +analyzer: + exclude: + - build/** diff --git a/web/gallery/assets/preview.png b/web/gallery/assets/preview.png deleted file mode 100644 index a70b50cf96bfa08cc083d03497702d8a6933a70c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22645 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 outList = []; - outList.add(ResultToken(currentTermValue)); + final List outList = [ + ResultToken(currentTermValue), + ]; return CalcExpression(outList, ExpressionState.Result); } diff --git a/web/gallery/lib/demo/colors_demo.dart b/web/gallery/lib/demo/colors_demo.dart index d27e70490..85d7b8170 100644 --- a/web/gallery/lib/demo/colors_demo.dart +++ b/web/gallery/lib/demo/colors_demo.dart @@ -117,7 +117,7 @@ class PaletteTabView extends StatelessWidget { ); }), ], - ) + ), ); } } diff --git a/web/gallery/lib/demo/contacts_demo.dart b/web/gallery/lib/demo/contacts_demo.dart index 3dc5e5cd6..76753c4ae 100644 --- a/web/gallery/lib/demo/contacts_demo.dart +++ b/web/gallery/lib/demo/contacts_demo.dart @@ -54,33 +54,31 @@ class _ContactItem extends StatelessWidget { @override Widget build(BuildContext context) { final ThemeData themeData = Theme.of(context); - final List columnChildren = lines.sublist(0, lines.length - 1).map((String line) => Text(line)).toList(); - columnChildren.add(Text(lines.last, style: themeData.textTheme.caption)); - - final List rowChildren = [ - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: columnChildren, - ), - ), - ]; - if (icon != null) { - rowChildren.add(SizedBox( - width: 72.0, - child: IconButton( - icon: Icon(icon), - color: themeData.primaryColor, - onPressed: onPressed, - ), - )); - } return MergeSemantics( child: Padding( padding: const EdgeInsets.symmetric(vertical: 16.0), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: rowChildren, + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ...lines.sublist(0, lines.length - 1).map((String line) => Text(line)), + Text(lines.last, style: themeData.textTheme.caption), + ], + ), + ), + if (icon != null) + SizedBox( + width: 72.0, + child: IconButton( + icon: Icon(icon), + color: themeData.primaryColor, + onPressed: onPressed, + ), + ), + ], ), ), ); diff --git a/web/gallery/lib/demo/cupertino/cupertino_alert_demo.dart b/web/gallery/lib/demo/cupertino/cupertino_alert_demo.dart index ce0d749fd..7fbfb0e89 100644 --- a/web/gallery/lib/demo/cupertino/cupertino_alert_demo.dart +++ b/web/gallery/lib/demo/cupertino/cupertino_alert_demo.dart @@ -53,159 +53,146 @@ class _CupertinoAlertDemoState extends State { style: CupertinoTheme.of(context).textTheme.textStyle, child: Builder( builder: (BuildContext context) { - final List stackChildren = [ - CupertinoScrollbar( - child: ListView( - // Add more padding to the normal safe area. - padding: const EdgeInsets.symmetric(vertical: 24.0, horizontal: 72.0) - + MediaQuery.of(context).padding, - children: [ - CupertinoButton.filled( - child: const Text('Alert'), - onPressed: () { - showDemoDialog( - context: context, - child: CupertinoAlertDialog( - title: const Text('Discard draft?'), - actions: [ - CupertinoDialogAction( - child: const Text('Discard'), - isDestructiveAction: true, - onPressed: () { - Navigator.pop(context, 'Discard'); - }, - ), - CupertinoDialogAction( - child: const Text('Cancel'), - isDefaultAction: true, - onPressed: () { - Navigator.pop(context, 'Cancel'); - }, - ), - ], - ), - ); - }, - ), - const Padding(padding: EdgeInsets.all(8.0)), - CupertinoButton.filled( - child: const Text('Alert with Title'), - padding: const EdgeInsets.symmetric(vertical: 16.0, horizontal: 36.0), - onPressed: () { - showDemoDialog( - context: context, - child: CupertinoAlertDialog( - title: const Text('Allow "Maps" to access your location while you are using the app?'), - content: const Text('Your current location will be displayed on the map and used ' - 'for directions, nearby search results, and estimated travel times.'), - actions: [ - CupertinoDialogAction( - child: const Text('Don\'t Allow'), - onPressed: () { - Navigator.pop(context, 'Disallow'); - }, - ), - CupertinoDialogAction( - child: const Text('Allow'), - onPressed: () { - Navigator.pop(context, 'Allow'); - }, - ), - ], - ), - ); - }, - ), - const Padding(padding: EdgeInsets.all(8.0)), - CupertinoButton.filled( - child: const Text('Alert with Buttons'), - padding: const EdgeInsets.symmetric(vertical: 16.0, horizontal: 36.0), - onPressed: () { - showDemoDialog( - context: context, - child: const CupertinoDessertDialog( - title: Text('Select Favorite Dessert'), - content: Text('Please select your favorite type of dessert from the ' - 'list below. Your selection will be used to customize the suggested ' - 'list of eateries in your area.'), - ), - ); - }, - ), - const Padding(padding: EdgeInsets.all(8.0)), - CupertinoButton.filled( - child: const Text('Alert Buttons Only'), - padding: const EdgeInsets.symmetric(vertical: 16.0, horizontal: 36.0), - onPressed: () { - showDemoDialog( - context: context, - child: const CupertinoDessertDialog(), - ); - }, - ), - const Padding(padding: EdgeInsets.all(8.0)), - CupertinoButton.filled( - child: const Text('Action Sheet'), - padding: const EdgeInsets.symmetric(vertical: 16.0, horizontal: 36.0), - onPressed: () { - showDemoActionSheet( - context: context, - child: CupertinoActionSheet( - title: const Text('Favorite Dessert'), - message: const Text('Please select the best dessert from the options below.'), - actions: [ - CupertinoActionSheetAction( - child: const Text('Profiteroles'), - onPressed: () { - Navigator.pop(context, 'Profiteroles'); - }, - ), - CupertinoActionSheetAction( - child: const Text('Cannolis'), - onPressed: () { - Navigator.pop(context, 'Cannolis'); - }, - ), - CupertinoActionSheetAction( - child: const Text('Trifle'), - onPressed: () { - Navigator.pop(context, 'Trifle'); - }, - ), - ], - cancelButton: CupertinoActionSheetAction( - child: const Text('Cancel'), - isDefaultAction: true, - onPressed: () { - Navigator.pop(context, 'Cancel'); - }, - ), - ), - ); - }, - ), - ], - ), - ), - ]; - - if (lastSelectedValue != null) { - stackChildren.add( - Positioned( - bottom: 32.0, - child: Text('You selected: $lastSelectedValue'), - ), - ); - } return Stack( alignment: Alignment.center, - children: stackChildren, + children: [ + CupertinoScrollbar( + child: ListView( + // Add more padding to the normal safe area. + padding: const EdgeInsets.symmetric(vertical: 24.0, horizontal: 72.0) + + MediaQuery.of(context).padding, + children: [ + CupertinoButton.filled( + child: const Text('Alert'), + onPressed: () => _onAlertPress(context), + ), + const Padding(padding: EdgeInsets.all(8.0)), + CupertinoButton.filled( + child: const Text('Alert with Title'), + padding: const EdgeInsets.symmetric(vertical: 16.0, horizontal: 36.0), + onPressed: () => _onAlertWithTitlePress(context), + ), + const Padding(padding: EdgeInsets.all(8.0)), + CupertinoButton.filled( + child: const Text('Alert with Buttons'), + padding: const EdgeInsets.symmetric(vertical: 16.0, horizontal: 36.0), + onPressed: () => _onAlertWithButtonsPress(context), + ), + const Padding(padding: EdgeInsets.all(8.0)), + CupertinoButton.filled( + child: const Text('Alert Buttons Only'), + padding: const EdgeInsets.symmetric(vertical: 16.0, horizontal: 36.0), + onPressed: () { + showDemoDialog( + context: context, + child: const CupertinoDessertDialog(), + ); + }, + ), + const Padding(padding: EdgeInsets.all(8.0)), + CupertinoButton.filled( + child: const Text('Action Sheet'), + padding: const EdgeInsets.symmetric(vertical: 16.0, horizontal: 36.0), + onPressed: () => _onActionSheetPress(context), + ), + ], + ), + ), + if (lastSelectedValue != null) + Positioned( + bottom: 32.0, + child: Text('You selected: $lastSelectedValue'), + ), + ], ); }, ), ), ); } + + void _onAlertPress(BuildContext context) { + showDemoDialog( + context: context, + child: CupertinoAlertDialog( + title: const Text('Discard draft?'), + actions: [ + CupertinoDialogAction( + child: const Text('Discard'), + isDestructiveAction: true, + onPressed: () => Navigator.pop(context, 'Discard'), + ), + CupertinoDialogAction( + child: const Text('Cancel'), + isDefaultAction: true, + onPressed: () => Navigator.pop(context, 'Cancel'), + ), + ], + ), + ); + } + + void _onAlertWithTitlePress(BuildContext context) { + showDemoDialog( + context: context, + child: CupertinoAlertDialog( + title: const Text('Allow "Maps" to access your location while you are using the app?'), + content: const Text('Your current location will be displayed on the map and used ' + 'for directions, nearby search results, and estimated travel times.'), + actions: [ + CupertinoDialogAction( + child: const Text('Don\'t Allow'), + onPressed: () => Navigator.pop(context, 'Disallow'), + ), + CupertinoDialogAction( + child: const Text('Allow'), + onPressed: () => Navigator.pop(context, 'Allow'), + ), + ], + ), + ); + } + + void _onAlertWithButtonsPress(BuildContext context) { + showDemoDialog( + context: context, + child: const CupertinoDessertDialog( + title: Text('Select Favorite Dessert'), + content: Text('Please select your favorite type of dessert from the ' + 'list below. Your selection will be used to customize the suggested ' + 'list of eateries in your area.'), + ), + ); + } + + void _onActionSheetPress(BuildContext context) { + showDemoActionSheet( + context: context, + child: CupertinoActionSheet( + title: const Text('Favorite Dessert'), + message: const Text('Please select the best dessert from the options below.'), + actions: [ + CupertinoActionSheetAction( + child: const Text('Profiteroles'), + onPressed: () => Navigator.pop(context, 'Profiteroles'), + ), + CupertinoActionSheetAction( + child: const Text('Cannolis'), + onPressed: () => Navigator.pop(context, 'Cannolis'), + ), + CupertinoActionSheetAction( + child: const Text('Trifle'), + onPressed: () => Navigator.pop(context, 'Trifle'), + ), + ], + cancelButton: CupertinoActionSheetAction( + child: const Text('Cancel'), + isDefaultAction: true, + onPressed: () => Navigator.pop(context, 'Cancel'), + ), + ), + ); + } } class CupertinoDessertDialog extends StatelessWidget { diff --git a/web/gallery/lib/demo/cupertino/cupertino_navigation_demo.dart b/web/gallery/lib/demo/cupertino/cupertino_navigation_demo.dart index 5f842a0f7..5730c43ad 100644 --- a/web/gallery/lib/demo/cupertino/cupertino_navigation_demo.dart +++ b/web/gallery/lib/demo/cupertino/cupertino_navigation_demo.dart @@ -647,25 +647,21 @@ class Tab2ConversationRow extends StatelessWidget { @override Widget build(BuildContext context) { - final List children = []; - if (avatar != null) - children.add(avatar); - final bool isSelf = avatar == null; - children.add( - Tab2ConversationBubble( - text: text, - color: isSelf - ? Tab2ConversationBubbleColor.blue - : Tab2ConversationBubbleColor.gray, - ), - ); return SafeArea( child: Row( mainAxisAlignment: isSelf ? MainAxisAlignment.end : MainAxisAlignment.start, mainAxisSize: MainAxisSize.min, crossAxisAlignment: isSelf ? CrossAxisAlignment.center : CrossAxisAlignment.end, - children: children, + children: [ + if (avatar != null) avatar, + Tab2ConversationBubble( + text: text, + color: isSelf + ? Tab2ConversationBubbleColor.blue + : Tab2ConversationBubbleColor.gray, + ), + ], ), ); } diff --git a/web/gallery/lib/demo/fortnightly/fortnightly.dart b/web/gallery/lib/demo/fortnightly/fortnightly.dart index f8dcde8a9..1e0209e73 100644 --- a/web/gallery/lib/demo/fortnightly/fortnightly.dart +++ b/web/gallery/lib/demo/fortnightly/fortnightly.dart @@ -139,7 +139,7 @@ class FruitPage extends StatelessWidget { padding: const EdgeInsets.symmetric(vertical: 16), child: Row( children: [ - CircleAvatar( + const CircleAvatar( backgroundImage: ExactAssetImage( 'people/square/trevor.png', package: 'flutter_gallery_assets', diff --git a/web/gallery/lib/demo/material/backdrop_demo.dart b/web/gallery/lib/demo/material/backdrop_demo.dart index 0d2c785c4..89fb9fb27 100644 --- a/web/gallery/lib/demo/material/backdrop_demo.dart +++ b/web/gallery/lib/demo/material/backdrop_demo.dart @@ -140,7 +140,7 @@ class CategoryView extends StatelessWidget { ], ); }).toList(), - ) + ), ); } } diff --git a/web/gallery/lib/demo/material/banner_demo.dart b/web/gallery/lib/demo/material/banner_demo.dart index 68af50df3..d555a092b 100644 --- a/web/gallery/lib/demo/material/banner_demo.dart +++ b/web/gallery/lib/demo/material/banner_demo.dart @@ -57,7 +57,7 @@ class _BannerDemoState extends State { setState(() { _displayBanner = false; }); - } + }, ), if (_showMultipleActions) FlatButton( @@ -66,7 +66,7 @@ class _BannerDemoState extends State { setState(() { _displayBanner = false; }); - } + }, ), ], ); diff --git a/web/gallery/lib/demo/material/bottom_navigation_demo.dart b/web/gallery/lib/demo/material/bottom_navigation_demo.dart index 6efefa3cc..b94a402c6 100644 --- a/web/gallery/lib/demo/material/bottom_navigation_demo.dart +++ b/web/gallery/lib/demo/material/bottom_navigation_demo.dart @@ -164,10 +164,9 @@ class _BottomNavigationDemoState extends State } Widget _buildTransitionsStack() { - final List transitions = []; - - for (NavigationIconView view in _navigationViews) - transitions.add(view.transition(_type, context)); + final List transitions = [ + for (NavigationIconView view in _navigationViews) view.transition(_type, context), + ]; // We want to have the newly animating (fading in) views on top. transitions.sort((FadeTransition a, FadeTransition b) { diff --git a/web/gallery/lib/demo/material/cards_demo.dart b/web/gallery/lib/demo/material/cards_demo.dart index 39c110695..fe7e29971 100644 --- a/web/gallery/lib/demo/material/cards_demo.dart +++ b/web/gallery/lib/demo/material/cards_demo.dart @@ -262,89 +262,83 @@ class TravelDestinationContent extends StatelessWidget { final TextStyle titleStyle = theme.textTheme.headline.copyWith(color: Colors.white); final TextStyle descriptionStyle = theme.textTheme.subhead; - final List children = [ - // Photo and title. - SizedBox( - height: 184.0, - child: Stack( - children: [ - Positioned.fill( - // In order to have the ink splash appear above the image, you - // must use Ink.image. This allows the image to be painted as part - // of the Material and display ink effects above it. Using a - // standard Image will obscure the ink splash. - child: Ink.image( - image: AssetImage(destination.assetName, package: destination.assetPackage), - fit: BoxFit.cover, - child: Container(), - ), - ), - Positioned( - bottom: 16.0, - left: 16.0, - right: 16.0, - child: FittedBox( - fit: BoxFit.scaleDown, - alignment: Alignment.centerLeft, - child: Text( - destination.title, - style: titleStyle, + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Photo and title. + SizedBox( + height: 184.0, + child: Stack( + children: [ + Positioned.fill( + // In order to have the ink splash appear above the image, you + // must use Ink.image. This allows the image to be painted as part + // of the Material and display ink effects above it. Using a + // standard Image will obscure the ink splash. + child: Ink.image( + image: AssetImage(destination.assetName, package: destination.assetPackage), + fit: BoxFit.cover, + child: Container(), ), ), - ), - ], - ), - ), - // Description and share/explore buttons. - Padding( - padding: const EdgeInsets.fromLTRB(16.0, 16.0, 16.0, 0.0), - child: DefaultTextStyle( - softWrap: false, - overflow: TextOverflow.ellipsis, - style: descriptionStyle, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // three line description - Padding( - padding: const EdgeInsets.only(bottom: 8.0), - child: Text( - destination.description, - style: descriptionStyle.copyWith(color: Colors.black54), + Positioned( + bottom: 16.0, + left: 16.0, + right: 16.0, + child: FittedBox( + fit: BoxFit.scaleDown, + alignment: Alignment.centerLeft, + child: Text( + destination.title, + style: titleStyle, + ), ), ), - Text(destination.city), - Text(destination.location), ], ), ), - ), - ]; - - if (destination.type == CardDemoType.standard) { - children.add( - // share, explore buttons - ButtonBar( - alignment: MainAxisAlignment.start, - children: [ - FlatButton( - child: Text('SHARE', semanticsLabel: 'Share ${destination.title}'), - textColor: Colors.amber.shade500, - onPressed: () { print('pressed'); }, - ), - FlatButton( - child: Text('EXPLORE', semanticsLabel: 'Explore ${destination.title}'), - textColor: Colors.amber.shade500, - onPressed: () { print('pressed'); }, + // Description and share/explore buttons. + Padding( + padding: const EdgeInsets.fromLTRB(16.0, 16.0, 16.0, 0.0), + child: DefaultTextStyle( + softWrap: false, + overflow: TextOverflow.ellipsis, + style: descriptionStyle, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // three line description + Padding( + padding: const EdgeInsets.only(bottom: 8.0), + child: Text( + destination.description, + style: descriptionStyle.copyWith(color: Colors.black54), + ), + ), + Text(destination.city), + Text(destination.location), + ], ), - ], + ), ), - ); - } - - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: children, + if (destination.type == CardDemoType.standard) + // share, explore buttons + ButtonBar( + alignment: MainAxisAlignment.start, + children: [ + FlatButton( + child: Text('SHARE', semanticsLabel: 'Share ${destination.title}'), + textColor: Colors.amber.shade500, + onPressed: () { print('pressed'); }, + ), + FlatButton( + child: Text('EXPLORE', semanticsLabel: 'Explore ${destination.title}'), + textColor: Colors.amber.shade500, + onPressed: () { print('pressed'); }, + ), + ], + ), + ], ); } } diff --git a/web/gallery/lib/demo/material/chip_demo.dart b/web/gallery/lib/demo/material/chip_demo.dart index 6c464db70..8528bd1a4 100644 --- a/web/gallery/lib/demo/material/chip_demo.dart +++ b/web/gallery/lib/demo/material/chip_demo.dart @@ -83,40 +83,36 @@ class _ChipsTile extends StatelessWidget { // Wraps a list of chips into a ListTile for display as a section in the demo. @override Widget build(BuildContext context) { - final List cardChildren = [ - Container( - padding: const EdgeInsets.only(top: 16.0, bottom: 4.0), - alignment: Alignment.center, - child: Text(label, textAlign: TextAlign.start), - ), - ]; - if (children.isNotEmpty) { - cardChildren.add(Wrap( - children: children.map((Widget chip) { - return Padding( - padding: const EdgeInsets.all(2.0), - child: chip, - ); - }).toList())); - } else { - final TextStyle textStyle = Theme.of(context).textTheme.caption.copyWith(fontStyle: FontStyle.italic); - cardChildren.add( - Semantics( - container: true, - child: Container( - alignment: Alignment.center, - constraints: const BoxConstraints(minWidth: 48.0, minHeight: 48.0), - padding: const EdgeInsets.all(8.0), - child: Text('None', style: textStyle), - ), - )); - } - return Card( semanticContainer: false, child: Column( mainAxisSize: MainAxisSize.min, - children: cardChildren, + children: [ + Container( + padding: const EdgeInsets.only(top: 16.0, bottom: 4.0), + alignment: Alignment.center, + child: Text(label, textAlign: TextAlign.start), + ), + if (children.isNotEmpty) + Wrap( + children: children.map((Widget chip) { + return Padding( + padding: const EdgeInsets.all(2.0), + child: chip, + ); + }).toList(), + ) + else + Semantics( + container: true, + child: Container( + alignment: Alignment.center, + constraints: const BoxConstraints(minWidth: 48.0, minHeight: 48.0), + padding: const EdgeInsets.all(8.0), + child: Text('None', style: Theme.of(context).textTheme.caption.copyWith(fontStyle: FontStyle.italic)), + ), + ), + ], ), ); } diff --git a/web/gallery/lib/demo/material/leave_behind_demo.dart b/web/gallery/lib/demo/material/leave_behind_demo.dart index 4ab956253..87e8d3eca 100644 --- a/web/gallery/lib/demo/material/leave_behind_demo.dart +++ b/web/gallery/lib/demo/material/leave_behind_demo.dart @@ -245,14 +245,18 @@ class _LeaveBehindListItem extends StatelessWidget { }, background: Container( color: theme.primaryColor, - child: const ListTile( - leading: Icon(Icons.delete, color: Colors.white, size: 36.0), + child: const Center( + child: ListTile( + leading: Icon(Icons.delete, color: Colors.white, size: 36.0), + ), ), ), secondaryBackground: Container( color: theme.primaryColor, - child: const ListTile( - trailing: Icon(Icons.archive, color: Colors.white, size: 36.0), + child: const Center( + child: ListTile( + trailing: Icon(Icons.archive, color: Colors.white, size: 36.0), + ), ), ), child: Container( diff --git a/web/gallery/lib/demo/material/search_demo.dart b/web/gallery/lib/demo/material/search_demo.dart index d497bdd7d..bf3357363 100644 --- a/web/gallery/lib/demo/material/search_demo.dart +++ b/web/gallery/lib/demo/material/search_demo.dart @@ -204,22 +204,23 @@ class _SearchDemoSearchDelegate extends SearchDelegate { @override List buildActions(BuildContext context) { return [ - query.isEmpty - ? IconButton( - tooltip: 'Voice Search', - icon: const Icon(Icons.mic), - onPressed: () { - query = 'TODO: implement voice input'; - }, - ) - : IconButton( - tooltip: 'Clear', - icon: const Icon(Icons.clear), - onPressed: () { - query = ''; - showSuggestions(context); - }, - ), + if (query.isEmpty) + IconButton( + tooltip: 'Voice Search', + icon: const Icon(Icons.mic), + onPressed: () { + query = 'TODO: implement voice input'; + }, + ) + else + IconButton( + tooltip: 'Clear', + icon: const Icon(Icons.clear), + onPressed: () { + query = ''; + showSuggestions(context); + }, + ), ]; } } diff --git a/web/gallery/lib/demo/material/snack_bar_demo.dart b/web/gallery/lib/demo/material/snack_bar_demo.dart index 011203d6f..891d8d757 100644 --- a/web/gallery/lib/demo/material/snack_bar_demo.dart +++ b/web/gallery/lib/demo/material/snack_bar_demo.dart @@ -88,7 +88,7 @@ class _SnackBarDemoState extends State { tooltip: 'Create', onPressed: () { print('Floating Action Button was pressed'); - } + }, ), ); } diff --git a/web/gallery/lib/demo/shrine/backdrop.dart b/web/gallery/lib/demo/shrine/backdrop.dart index b041301d0..6336b873a 100644 --- a/web/gallery/lib/demo/shrine/backdrop.dart +++ b/web/gallery/lib/demo/shrine/backdrop.dart @@ -22,6 +22,65 @@ const Cubic _kDecelerateCurve = Cubic(0.23, 0.94, 0.41, 1.0); const double _kPeakVelocityTime = 0.248210; const double _kPeakVelocityProgress = 0.379146; +class _TappableWhileStatusIs extends StatefulWidget { + const _TappableWhileStatusIs( + this.status, { + Key key, + this.controller, + this.child, + }) : super(key: key); + + final AnimationController controller; + final AnimationStatus status; + final Widget child; + + @override + _TappableWhileStatusIsState createState() => _TappableWhileStatusIsState(); +} + +class _TappableWhileStatusIsState extends State<_TappableWhileStatusIs> { + bool _active; + + @override + void initState() { + super.initState(); + widget.controller.addStatusListener(_handleStatusChange); + _active = widget.controller.status == widget.status; + } + + @override + void dispose() { + widget.controller.removeStatusListener(_handleStatusChange); + super.dispose(); + } + + void _handleStatusChange(AnimationStatus status) { + final bool value = widget.controller.status == widget.status; + if (_active != value) { + setState(() { + _active = value; + }); + } + } + + @override + Widget build(BuildContext context) { + Widget child = AbsorbPointer( + absorbing: !_active, + child: widget.child, + ); + + if (!_active) { + child = FocusScope( + canRequestFocus: false, + debugLabel: '$_TappableWhileStatusIs', + child: child, + ); + } + return child; + } +} + class _FrontLayer extends StatelessWidget { const _FrontLayer({ Key key, @@ -275,12 +334,20 @@ class _BackdropState extends State with SingleTickerProviderStateMixin return Stack( key: _backdropKey, children: [ - widget.backLayer, + _TappableWhileStatusIs( + AnimationStatus.dismissed, + controller: _controller, + child: widget.backLayer, + ), PositionedTransition( rect: _layerAnimation, child: _FrontLayer( onTap: _toggleBackdropLayerVisibility, - child: widget.frontLayer, + child: _TappableWhileStatusIs( + AnimationStatus.completed, + controller: _controller, + child: widget.frontLayer, + ), ), ), ], diff --git a/web/gallery/lib/demo/typography_demo.dart b/web/gallery/lib/demo/typography_demo.dart index 18c3e3a96..b974be556 100644 --- a/web/gallery/lib/demo/typography_demo.dart +++ b/web/gallery/lib/demo/typography_demo.dart @@ -48,6 +48,8 @@ class TypographyDemo extends StatelessWidget { Widget build(BuildContext context) { final TextTheme textTheme = Theme.of(context).textTheme; final List styleItems = [ + if (MediaQuery.of(context).size.width > 500.0) + TextStyleItem(name: 'Display 4', style: textTheme.display4, text: 'Light 112sp'), TextStyleItem(name: 'Display 3', style: textTheme.display3, text: 'Regular 56sp'), TextStyleItem(name: 'Display 2', style: textTheme.display2, text: 'Regular 45sp'), TextStyleItem(name: 'Display 1', style: textTheme.display1, text: 'Regular 34sp'), @@ -60,14 +62,6 @@ class TypographyDemo extends StatelessWidget { TextStyleItem(name: 'Button', style: textTheme.button, text: 'MEDIUM (ALL CAPS) 14sp'), ]; - if (MediaQuery.of(context).size.width > 500.0) { - styleItems.insert(0, TextStyleItem( - name: 'Display 4', - style: textTheme.display4, - text: 'Light 112sp', - )); - } - return Scaffold( appBar: AppBar(title: const Text('Typography')), body: SafeArea( diff --git a/web/gallery/lib/gallery/backdrop.dart b/web/gallery/lib/gallery/backdrop.dart index 974e6afee..609f3a405 100644 --- a/web/gallery/lib/gallery/backdrop.dart +++ b/web/gallery/lib/gallery/backdrop.dart @@ -66,10 +66,19 @@ class _TappableWhileStatusIsState extends State<_TappableWhileStatusIs> { @override Widget build(BuildContext context) { - return AbsorbPointer( + Widget child = AbsorbPointer( absorbing: !_active, child: widget.child, ); + + if (!_active) { + child = FocusScope( + canRequestFocus: false, + debugLabel: '$_TappableWhileStatusIs', + child: child, + ); + } + return child; } } @@ -138,36 +147,31 @@ class _BackAppBar extends StatelessWidget { @override Widget build(BuildContext context) { - final List children = [ - Container( - alignment: Alignment.center, - width: 56.0, - child: leading, - ), - Expanded( - child: title, - ), - ]; - - if (trailing != null) { - children.add( - Container( - alignment: Alignment.center, - width: 56.0, - child: trailing, - ), - ); - } - final ThemeData theme = Theme.of(context); - return IconTheme.merge( data: theme.primaryIconTheme, child: DefaultTextStyle( style: theme.primaryTextTheme.title, child: SizedBox( height: _kBackAppBarHeight, - child: Row(children: children), + child: Row( + children: [ + Container( + alignment: Alignment.center, + width: 56.0, + child: leading, + ), + Expanded( + child: title, + ), + if (trailing != null) + Container( + alignment: Alignment.center, + width: 56.0, + child: trailing, + ), + ], + ), ), ), ); @@ -255,95 +259,92 @@ class _BackdropState extends State with SingleTickerProviderStateMixin begin: RelativeRect.fromLTRB(0.0, constraints.biggest.height - _kFrontClosedHeight, 0.0, 0.0), end: const RelativeRect.fromLTRB(0.0, _kBackAppBarHeight, 0.0, 0.0), )); - - final List layers = [ - // Back layer - Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - _BackAppBar( - leading: widget.frontAction, - title: _CrossFadeTransition( - progress: _controller, - alignment: AlignmentDirectional.centerStart, - child0: Semantics(namesRoute: true, child: widget.frontTitle), - child1: Semantics(namesRoute: true, child: widget.backTitle), - ), - trailing: IconButton( - onPressed: _toggleFrontLayer, - tooltip: 'Toggle options page', - icon: AnimatedIcon( - icon: AnimatedIcons.close_menu, + return Stack( + key: _backdropKey, + children: [ + // Back layer + Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + _BackAppBar( + leading: widget.frontAction, + title: _CrossFadeTransition( progress: _controller, + alignment: AlignmentDirectional.centerStart, + child0: Semantics(namesRoute: true, child: widget.frontTitle), + child1: Semantics(namesRoute: true, child: widget.backTitle), + ), + trailing: IconButton( + onPressed: _toggleFrontLayer, + tooltip: 'Toggle options page', + icon: AnimatedIcon( + icon: AnimatedIcons.close_menu, + progress: _controller, + ), ), ), - ), - Expanded( - child: Visibility( - child: widget.backLayer, - visible: _controller.status != AnimationStatus.completed, - maintainState: true, - ), - ), - ], - ), - // Front layer - PositionedTransition( - rect: frontRelativeRect, - child: AnimatedBuilder( - animation: _controller, - builder: (BuildContext context, Widget child) { - return PhysicalShape( - elevation: 12.0, - color: Theme.of(context).canvasColor, - clipper: ShapeBorderClipper( - shape: BeveledRectangleBorder( - borderRadius: _kFrontHeadingBevelRadius.transform(_controller.value), + Expanded( + child: _TappableWhileStatusIs( + AnimationStatus.dismissed, + controller: _controller, + child: Visibility( + child: widget.backLayer, + visible: _controller.status != AnimationStatus.completed, + maintainState: true, ), ), - clipBehavior: Clip.antiAlias, - child: child, - ); - }, - child: _TappableWhileStatusIs( - AnimationStatus.completed, - controller: _controller, - child: FadeTransition( - opacity: _frontOpacity, - child: widget.frontLayer, ), - ), + ], ), - ), - ]; - - // The front "heading" is a (typically transparent) widget that's stacked on - // top of, and at the top of, the front layer. It adds support for dragging - // the front layer up and down and for opening and closing the front layer - // with a tap. It may obscure part of the front layer's topmost child. - if (widget.frontHeading != null) { - layers.add( + // Front layer PositionedTransition( rect: frontRelativeRect, - child: ExcludeSemantics( - child: Container( - alignment: Alignment.topLeft, - child: GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: _toggleFrontLayer, - onVerticalDragUpdate: _handleDragUpdate, - onVerticalDragEnd: _handleDragEnd, - child: widget.frontHeading, + child: AnimatedBuilder( + animation: _controller, + builder: (BuildContext context, Widget child) { + return PhysicalShape( + elevation: 12.0, + color: Theme.of(context).canvasColor, + clipper: ShapeBorderClipper( + shape: BeveledRectangleBorder( + borderRadius: _kFrontHeadingBevelRadius.transform(_controller.value), + ), + ), + clipBehavior: Clip.antiAlias, + child: child, + ); + }, + child: _TappableWhileStatusIs( + AnimationStatus.completed, + controller: _controller, + child: FadeTransition( + opacity: _frontOpacity, + child: widget.frontLayer, ), ), ), ), - ); - } - - return Stack( - key: _backdropKey, - children: layers, + // The front "heading" is a (typically transparent) widget that's stacked on + // top of, and at the top of, the front layer. It adds support for dragging + // the front layer up and down and for opening and closing the front layer + // with a tap. It may obscure part of the front layer's topmost child. + if (widget.frontHeading != null) + PositionedTransition( + rect: frontRelativeRect, + child: ExcludeSemantics( + child: Container( + alignment: Alignment.topLeft, + child: GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: _toggleFrontLayer, + onVerticalDragUpdate: _handleDragUpdate, + onVerticalDragEnd: _handleDragEnd, + child: widget.frontHeading, + ), + ), + ), + ), + ], ); } diff --git a/web/gallery/lib/gallery/home.dart b/web/gallery/lib/gallery/home.dart index 38810876c..ec785383c 100644 --- a/web/gallery/lib/gallery/home.dart +++ b/web/gallery/lib/gallery/home.dart @@ -184,26 +184,6 @@ class _DemoItem extends StatelessWidget { final ThemeData theme = Theme.of(context); final bool isDark = theme.brightness == Brightness.dark; final double textScaleFactor = MediaQuery.textScaleFactorOf(context); - - final List titleChildren = [ - Text( - demo.title, - style: theme.textTheme.subhead.copyWith( - color: isDark ? Colors.white : const Color(0xFF202124), - ), - ), - ]; - if (demo.subtitle != null) { - titleChildren.add( - Text( - demo.subtitle, - style: theme.textTheme.body1.copyWith( - color: isDark ? Colors.white : const Color(0xFF60646B) - ), - ), - ); - } - return RawMaterialButton( padding: EdgeInsets.zero, splashColor: theme.primaryColor.withOpacity(0.12), @@ -229,7 +209,21 @@ class _DemoItem extends StatelessWidget { child: Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.stretch, - children: titleChildren, + children: [ + Text( + demo.title, + style: theme.textTheme.subhead.copyWith( + color: isDark ? Colors.white : const Color(0xFF202124), + ), + ), + if (demo.subtitle != null) + Text( + demo.subtitle, + style: theme.textTheme.body1.copyWith( + color: isDark ? Colors.white : const Color(0xFF60646B) + ), + ), + ], ), ), const SizedBox(width: 44.0), @@ -294,11 +288,11 @@ class _GalleryHomeState extends State with SingleTickerProviderStat GalleryDemoCategory _category; static Widget _topHomeLayout(Widget currentChild, List previousChildren) { - List children = previousChildren; - if (currentChild != null) - children = children.toList()..add(currentChild); return Stack( - children: children, + children: [ + ...previousChildren, + if (currentChild != null) currentChild, + ], alignment: Alignment.topCenter, ); } diff --git a/web/gallery/lib/gallery/options.dart b/web/gallery/lib/gallery/options.dart index 6076d0108..865e19f9f 100644 --- a/web/gallery/lib/gallery/options.dart +++ b/web/gallery/lib/gallery/options.dart @@ -425,13 +425,10 @@ class GalleryOptionsPage extends StatelessWidget { options.showPerformanceOverlay == null) return const []; - final List items = [ + return [ const Divider(), const _Heading('Diagnostics'), - ]; - - if (options.showOffscreenLayersCheckerboard != null) { - items.add( + if (options.showOffscreenLayersCheckerboard != null) _BooleanItem( 'Highlight offscreen layers', options.showOffscreenLayersCheckerboard, @@ -439,10 +436,7 @@ class GalleryOptionsPage extends StatelessWidget { onOptionsChanged(options.copyWith(showOffscreenLayersCheckerboard: value)); }, ), - ); - } - if (options.showRasterCacheImagesCheckerboard != null) { - items.add( + if (options.showRasterCacheImagesCheckerboard != null) _BooleanItem( 'Highlight raster cache images', options.showRasterCacheImagesCheckerboard, @@ -450,10 +444,7 @@ class GalleryOptionsPage extends StatelessWidget { onOptionsChanged(options.copyWith(showRasterCacheImagesCheckerboard: value)); }, ), - ); - } - if (options.showPerformanceOverlay != null) { - items.add( + if (options.showPerformanceOverlay != null) _BooleanItem( 'Show performance overlay', options.showPerformanceOverlay, @@ -461,10 +452,7 @@ class GalleryOptionsPage extends StatelessWidget { onOptionsChanged(options.copyWith(showPerformanceOverlay: value)); }, ), - ); - } - - return items; + ]; } @override diff --git a/web/gallery/pubspec.lock b/web/gallery/pubspec.lock index 691da9a03..7b326d3cd 100644 --- a/web/gallery/pubspec.lock +++ b/web/gallery/pubspec.lock @@ -56,7 +56,7 @@ packages: name: connectivity url: "https://pub.dartlang.org" source: hosted - version: "0.4.3+7" + version: "0.4.5+1" convert: dependency: "direct dev" description: @@ -70,7 +70,7 @@ packages: name: crypto url: "https://pub.dartlang.org" source: hosted - version: "2.1.2" + version: "2.1.3" csslib: dependency: "direct dev" description: @@ -91,19 +91,24 @@ packages: name: device_info url: "https://pub.dartlang.org" source: hosted - version: "0.4.0+2" + version: "0.4.1" file: dependency: "direct dev" description: name: file url: "https://pub.dartlang.org" source: hosted - version: "5.0.8+1" + version: "5.1.0" flutter: dependency: "direct main" description: flutter source: sdk version: "0.0.0" + flutter_driver: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" flutter_gallery_assets: dependency: "direct main" description: @@ -111,6 +116,18 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.1.9+2" + flutter_goldens: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + flutter_goldens_client: + dependency: transitive + description: + path: "../../../flutter/packages/flutter_goldens_client" + relative: true + source: path + version: "0.0.0" flutter_test: dependency: "direct dev" description: flutter @@ -123,20 +140,25 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.1.19" + fuchsia_remote_debug_protocol: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" glob: dependency: "direct dev" description: name: glob url: "https://pub.dartlang.org" source: hosted - version: "1.1.7" + version: "1.2.0" html: dependency: "direct dev" description: name: html url: "https://pub.dartlang.org" source: hosted - version: "0.14.0+2" + version: "0.14.0+3" http: dependency: "direct dev" description: @@ -171,7 +193,7 @@ packages: name: intl url: "https://pub.dartlang.org" source: hosted - version: "0.15.8" + version: "0.16.0" io: dependency: "direct dev" description: @@ -228,13 +250,27 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.2" + node_interop: + dependency: "direct dev" + description: + name: node_interop + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.3" + node_io: + dependency: "direct dev" + description: + name: node_io + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.1+2" node_preamble: dependency: "direct dev" description: name: node_preamble url: "https://pub.dartlang.org" source: hosted - version: "1.4.6" + version: "1.4.8" package_config: dependency: "direct dev" description: @@ -290,7 +326,7 @@ packages: name: process url: "https://pub.dartlang.org" source: hosted - version: "3.0.11" + version: "3.0.12" pub_semver: dependency: "direct dev" description: @@ -435,7 +471,7 @@ packages: name: url_launcher url: "https://pub.dartlang.org" source: hosted - version: "5.1.2" + version: "5.2.3" vector_math: dependency: "direct main" description: @@ -449,7 +485,7 @@ packages: name: video_player url: "https://pub.dartlang.org" source: hosted - version: "0.10.1+6" + version: "0.10.2+5" vm_service_client: dependency: "direct dev" description: @@ -470,7 +506,7 @@ packages: name: web_socket_channel url: "https://pub.dartlang.org" source: hosted - version: "1.0.15" + version: "1.1.0" xml: dependency: "direct dev" description: @@ -484,7 +520,7 @@ packages: name: yaml url: "https://pub.dartlang.org" source: hosted - version: "2.1.16" + version: "2.2.0" sdks: dart: ">=2.4.0 <3.0.0" - flutter: ">=1.5.0 <2.0.0" + flutter: ">=1.9.1+hotfix.4 <2.0.0" diff --git a/web/gallery/pubspec.yaml b/web/gallery/pubspec.yaml index f255482c2..5e9d94f9b 100644 --- a/web/gallery/pubspec.yaml +++ b/web/gallery/pubspec.yaml @@ -8,13 +8,13 @@ dependencies: flutter: sdk: flutter collection: 1.14.11 - device_info: 0.4.0+2 - intl: 0.15.8 - connectivity: 0.4.3+7 + device_info: 0.4.1 + intl: 0.16.0 + connectivity: 0.4.5+1 string_scanner: 1.0.5 - url_launcher: 5.1.2 + url_launcher: 5.2.3 cupertino_icons: 0.1.2 - video_player: 0.10.1+6 + video_player: 0.10.2+5 scoped_model: 1.0.1 shrine_images: 1.1.2 @@ -32,6 +32,10 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter + flutter_driver: + sdk: flutter + flutter_goldens: + sdk: flutter test: 1.6.3 analyzer: 0.36.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -40,12 +44,12 @@ dev_dependencies: async: 2.3.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" boolean_selector: 1.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" convert: 2.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - crypto: 2.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + crypto: 2.1.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" csslib: 0.16.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - file: 5.0.8+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + file: 5.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" front_end: 0.1.19 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - html: 0.14.0+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + glob: 1.2.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + html: 0.14.0+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" http: 0.12.0+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" http_multi_server: 2.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" http_parser: 3.1.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -57,14 +61,16 @@ dev_dependencies: matcher: 0.12.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" mime: 0.9.6+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" multi_server_socket: 1.0.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - node_preamble: 1.4.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + node_interop: 1.0.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + node_io: 1.0.1+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + node_preamble: 1.4.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" package_config: 1.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" package_resolver: 1.0.10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" pedantic: 1.8.0+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" petitparser: 2.4.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" platform: 2.2.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" pool: 1.4.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - process: 3.0.11 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + process: 3.0.12 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" pub_semver: 1.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" quiver: 2.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" shelf: 0.7.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -79,9 +85,9 @@ dev_dependencies: test_core: 0.2.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" vm_service_client: 0.2.6+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" watcher: 0.9.7+12 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - web_socket_channel: 1.0.15 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + web_socket_channel: 1.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" xml: 3.5.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - yaml: 2.1.16 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + yaml: 2.2.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" flutter: uses-material-design: true @@ -192,7 +198,6 @@ flutter: - packages/shrine_images/35-0.jpg - packages/shrine_images/36-0.jpg - packages/shrine_images/37-0.jpg - - preview.png fonts: - family: Raleway @@ -244,15 +249,85 @@ flutter: weight: 400 - family: LibreFranklin fonts: - - asset: packages/flutter_gallery_assets/fonts/librefranklin/LibreFranklin-Bold.ttf - - asset: packages/flutter_gallery_assets/fonts/librefranklin/LibreFranklin-Light.ttf - - asset: packages/flutter_gallery_assets/fonts/librefranklin/LibreFranklin-Medium.ttf - - asset: packages/flutter_gallery_assets/fonts/librefranklin/LibreFranklin-Regular.ttf + - asset: packages/flutter_gallery_assets/fonts/librefranklin/LibreFranklin-Bold.ttf + - asset: packages/flutter_gallery_assets/fonts/librefranklin/LibreFranklin-Light.ttf + - asset: packages/flutter_gallery_assets/fonts/librefranklin/LibreFranklin-Medium.ttf + - asset: packages/flutter_gallery_assets/fonts/librefranklin/LibreFranklin-Regular.ttf - family: Merriweather fonts: - - asset: packages/flutter_gallery_assets/fonts/merriweather/Merriweather-BlackItalic.ttf - - asset: packages/flutter_gallery_assets/fonts/merriweather/Merriweather-Italic.ttf - - asset: packages/flutter_gallery_assets/fonts/merriweather/Merriweather-Regular.ttf - - asset: packages/flutter_gallery_assets/fonts/merriweather/Merriweather-Light.ttf + - asset: packages/flutter_gallery_assets/fonts/merriweather/Merriweather-BlackItalic.ttf + - asset: packages/flutter_gallery_assets/fonts/merriweather/Merriweather-Italic.ttf + - asset: packages/flutter_gallery_assets/fonts/merriweather/Merriweather-Regular.ttf + - asset: packages/flutter_gallery_assets/fonts/merriweather/Merriweather-Light.ttf + # TODO (ryjohn): Find a way to get Cupertino fonts working + - family: .SF Pro Text + fonts: + - asset: packages/flutter_gallery_assets/fonts/private/googlesans/GoogleSans-BoldItalic.ttf + weight: 700 + style: italic + - asset: packages/flutter_gallery_assets/fonts/private/googlesans/GoogleSans-Bold.ttf + weight: 700 + - asset: packages/flutter_gallery_assets/fonts/private/googlesans/GoogleSans-Italic.ttf + weight: 400 + style: italic + - asset: packages/flutter_gallery_assets/fonts/private/googlesans/GoogleSans-MediumItalic.ttf + weight: 500 + style: italic + - asset: packages/flutter_gallery_assets/fonts/private/googlesans/GoogleSans-Medium.ttf + weight: 500 + - asset: packages/flutter_gallery_assets/fonts/private/googlesans/GoogleSans-Regular.ttf + weight: 400 + - family: .SF Pro Display + fonts: + - asset: packages/flutter_gallery_assets/fonts/private/googlesans/GoogleSansDisplay-BoldItalic.ttf + weight: 700 + style: italic + - asset: packages/flutter_gallery_assets/fonts/private/googlesans/GoogleSansDisplay-Bold.ttf + weight: 700 + - asset: packages/flutter_gallery_assets/fonts/private/googlesans/GoogleSansDisplay-Italic.ttf + weight: 400 + style: italic + - asset: packages/flutter_gallery_assets/fonts/private/googlesans/GoogleSansDisplay-MediumItalic.ttf + style: italic + weight: 500 + - asset: packages/flutter_gallery_assets/fonts/private/googlesans/GoogleSansDisplay-Medium.ttf + weight: 500 + - asset: packages/flutter_gallery_assets/fonts/private/googlesans/GoogleSansDisplay-Regular.ttf + weight: 400 + - family: .SF UI Text + fonts: + - asset: packages/flutter_gallery_assets/fonts/private/googlesans/GoogleSans-BoldItalic.ttf + weight: 700 + style: italic + - asset: packages/flutter_gallery_assets/fonts/private/googlesans/GoogleSans-Bold.ttf + weight: 700 + - asset: packages/flutter_gallery_assets/fonts/private/googlesans/GoogleSans-Italic.ttf + weight: 400 + style: italic + - asset: packages/flutter_gallery_assets/fonts/private/googlesans/GoogleSans-MediumItalic.ttf + weight: 500 + style: italic + - asset: packages/flutter_gallery_assets/fonts/private/googlesans/GoogleSans-Medium.ttf + weight: 500 + - asset: packages/flutter_gallery_assets/fonts/private/googlesans/GoogleSans-Regular.ttf + weight: 400 + - family: .SF UI Display + fonts: + - asset: packages/flutter_gallery_assets/fonts/private/googlesans/GoogleSansDisplay-BoldItalic.ttf + weight: 700 + style: italic + - asset: packages/flutter_gallery_assets/fonts/private/googlesans/GoogleSansDisplay-Bold.ttf + weight: 700 + - asset: packages/flutter_gallery_assets/fonts/private/googlesans/GoogleSansDisplay-Italic.ttf + weight: 400 + style: italic + - asset: packages/flutter_gallery_assets/fonts/private/googlesans/GoogleSansDisplay-MediumItalic.ttf + style: italic + weight: 500 + - asset: packages/flutter_gallery_assets/fonts/private/googlesans/GoogleSansDisplay-Medium.ttf + weight: 500 + - asset: packages/flutter_gallery_assets/fonts/private/googlesans/GoogleSansDisplay-Regular.ttf + weight: 400 + -# PUBSPEC CHECKSUM: ba0e +# PUBSPEC CHECKSUM: 76b5 diff --git a/web/gallery/test/demo/material/text_form_field_demo_test.dart b/web/gallery/test/demo/material/text_form_field_demo_test.dart deleted file mode 100644 index 27594e85d..000000000 --- a/web/gallery/test/demo/material/text_form_field_demo_test.dart +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// 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_gallery/demo/material/text_form_field_demo.dart'; -import 'package:flutter_test/flutter_test.dart'; - -void main() { - testWidgets('validates name field correctly', (WidgetTester tester) async { - await tester.pumpWidget(const MaterialApp(home: TextFormFieldDemo())); - - final Finder submitButton = find.widgetWithText(RaisedButton, 'SUBMIT'); - expect(submitButton, findsOneWidget); - - final Finder nameField = find.widgetWithText(TextFormField, 'Name * '); - expect(nameField, findsOneWidget); - - final Finder passwordField = - find.widgetWithText(TextFormField, 'Password *'); - expect(passwordField, findsOneWidget); - - await tester.enterText(nameField, ''); - await tester.pumpAndSettle(); - // The submit button isn't initially visible. Drag it into view so that - // it will see the tap. - await tester.drag(nameField, const Offset(0.0, -1200.0)); - await tester.pumpAndSettle(); - await tester.tap(submitButton); - await tester.pumpAndSettle(); - - // Now drag the password field (the submit button will be obscured by - // the snackbar) and expose the name field again. - await tester.drag(passwordField, const Offset(0.0, 1200.0)); - await tester.pumpAndSettle(); - expect(find.text('Name is required.'), findsOneWidget); - expect( - find.text('Please enter only alphabetical characters.'), findsNothing); - await tester.enterText(nameField, '#'); - await tester.pumpAndSettle(); - - // Make the submit button visible again (by dragging the name field), so - // it will see the tap. - await tester.drag(nameField, const Offset(0.0, -1200.0)); - await tester.tap(submitButton); - await tester.pumpAndSettle(); - expect(find.text('Name is required.'), findsNothing); - expect(find.text('Please enter only alphabetical characters.'), - findsOneWidget); - - await tester.enterText(nameField, 'Jane Doe'); - // TODO(b/123539399): Why does it pass in Flutter without this `drag`? - await tester.drag(nameField, const Offset(0.0, -1200.0)); - await tester.tap(submitButton); - await tester.pumpAndSettle(); - expect(find.text('Name is required.'), findsNothing); - expect( - find.text('Please enter only alphabetical characters.'), findsNothing); - }); -} diff --git a/web/gallery/test/gallery_test.dart b/web/gallery/test/gallery_test.dart deleted file mode 100644 index 2204418e9..000000000 --- a/web/gallery/test/gallery_test.dart +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'package:flutter_test/flutter_test.dart'; -import 'package:flutter_gallery/gallery/app.dart'; - -void main() { - testWidgets('Gallery starts', (WidgetTester tester) async { - await tester.pumpWidget(GalleryApp()); - }); -} diff --git a/web/gallery/web/index.html b/web/gallery/web/index.html index bee334924..ba232943d 100644 --- a/web/gallery/web/index.html +++ b/web/gallery/web/index.html @@ -1,10 +1,12 @@ + - - - gallery - - - - - + + Flutter Gallery + + + + + \ No newline at end of file