diff --git a/examples/flutter_gallery/lib/demo/cupertino/cupertino_activity_indicator_demo.dart b/examples/flutter_gallery/lib/demo/cupertino/cupertino_activity_indicator_demo.dart index d5efbbaebf6..e793cdfa4cc 100644 --- a/examples/flutter_gallery/lib/demo/cupertino/cupertino_activity_indicator_demo.dart +++ b/examples/flutter_gallery/lib/demo/cupertino/cupertino_activity_indicator_demo.dart @@ -3,18 +3,21 @@ // found in the LICENSE file. import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; + +import '../../gallery/demo.dart'; class CupertinoProgressIndicatorDemo extends StatelessWidget { static const String routeName = '/cupertino/progress_indicator'; @override Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: const Text('Cupertino Activity Indicator'), + return CupertinoPageScaffold( + navigationBar: CupertinoNavigationBar( + previousPageTitle: 'Cupertino', + middle: const Text('Cupertino Activity Indicator'), + trailing: CupertinoDemoDocumentationButton(routeName), ), - body: const Center( + child: const Center( child: CupertinoActivityIndicator(), ), ); diff --git a/examples/flutter_gallery/lib/demo/cupertino/cupertino_alert_demo.dart b/examples/flutter_gallery/lib/demo/cupertino/cupertino_alert_demo.dart index 137dc3dd8de..3c1a6bba4a5 100644 --- a/examples/flutter_gallery/lib/demo/cupertino/cupertino_alert_demo.dart +++ b/examples/flutter_gallery/lib/demo/cupertino/cupertino_alert_demo.dart @@ -5,6 +5,8 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import '../../gallery/demo.dart'; + class CupertinoAlertDemo extends StatefulWidget { static const String routeName = '/cupertino/alert'; @@ -53,6 +55,7 @@ class _CupertinoAlertDemoState extends State { key: _scaffoldKey, appBar: AppBar( title: const Text('Cupertino Alerts'), + actions: [MaterialDemoDocumentationButton(CupertinoAlertDemo.routeName)], ), body: ListView( padding: const EdgeInsets.symmetric(vertical: 24.0, horizontal: 72.0), diff --git a/examples/flutter_gallery/lib/demo/cupertino/cupertino_buttons_demo.dart b/examples/flutter_gallery/lib/demo/cupertino/cupertino_buttons_demo.dart index 6625fd518b3..1906b59e4c1 100644 --- a/examples/flutter_gallery/lib/demo/cupertino/cupertino_buttons_demo.dart +++ b/examples/flutter_gallery/lib/demo/cupertino/cupertino_buttons_demo.dart @@ -5,6 +5,8 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import '../../gallery/demo.dart'; + class CupertinoButtonsDemo extends StatefulWidget { static const String routeName = '/cupertino/buttons'; @@ -20,6 +22,7 @@ class _CupertinoButtonDemoState extends State { return Scaffold( appBar: AppBar( title: const Text('Cupertino Buttons'), + actions: [MaterialDemoDocumentationButton(CupertinoButtonsDemo.routeName)], ), body: Column( children: [ diff --git a/examples/flutter_gallery/lib/demo/cupertino/cupertino_navigation_demo.dart b/examples/flutter_gallery/lib/demo/cupertino/cupertino_navigation_demo.dart index fd32d73a166..e9a3e824ad0 100644 --- a/examples/flutter_gallery/lib/demo/cupertino/cupertino_navigation_demo.dart +++ b/examples/flutter_gallery/lib/demo/cupertino/cupertino_navigation_demo.dart @@ -8,6 +8,8 @@ import 'dart:math' as math; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import '../../gallery/demo.dart'; + const String _kGalleryAssetsPackage = 'flutter_gallery_assets'; const List coolColors = [ @@ -125,6 +127,15 @@ class ExitButton extends StatelessWidget { } } +final Widget trailingButtons = Row( + mainAxisSize: MainAxisSize.min, + children: [ + CupertinoDemoDocumentationButton(CupertinoNavigationDemo.routeName), + const Padding(padding: EdgeInsets.only(left: 8.0)), + const ExitButton(), + ], +); + class CupertinoDemoTab1 extends StatelessWidget { const CupertinoDemoTab1({this.colorItems, this.colorNameItems}); @@ -136,8 +147,8 @@ class CupertinoDemoTab1 extends StatelessWidget { return CupertinoPageScaffold( child: CustomScrollView( slivers: [ - const CupertinoSliverNavigationBar( - trailing: ExitButton(), + CupertinoSliverNavigationBar( + trailing: trailingButtons, ), SliverPadding( // Top media padding consumed by CupertinoSliverNavigationBar. @@ -421,8 +432,8 @@ class CupertinoDemoTab2 extends StatelessWidget { @override Widget build(BuildContext context) { return CupertinoPageScaffold( - navigationBar: const CupertinoNavigationBar( - trailing: ExitButton(), + navigationBar: CupertinoNavigationBar( + trailing: trailingButtons, ), child: ListView( children: [ @@ -704,8 +715,8 @@ class CupertinoDemoTab3 extends StatelessWidget { @override Widget build(BuildContext context) { return CupertinoPageScaffold( - navigationBar: const CupertinoNavigationBar( - trailing: ExitButton(), + navigationBar: CupertinoNavigationBar( + trailing: trailingButtons, ), child: DecoratedBox( decoration: const BoxDecoration(color: Color(0xFFEFEFF4)), diff --git a/examples/flutter_gallery/lib/demo/cupertino/cupertino_picker_demo.dart b/examples/flutter_gallery/lib/demo/cupertino/cupertino_picker_demo.dart index c4354012ff9..5d1e3ff2485 100644 --- a/examples/flutter_gallery/lib/demo/cupertino/cupertino_picker_demo.dart +++ b/examples/flutter_gallery/lib/demo/cupertino/cupertino_picker_demo.dart @@ -4,6 +4,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import '../../gallery/demo.dart'; import 'cupertino_navigation_demo.dart' show coolColorNames; const double _kPickerSheetHeight = 216.0; @@ -132,6 +133,7 @@ class _CupertinoPickerDemoState extends State { return Scaffold( appBar: AppBar( title: const Text('Cupertino Picker'), + actions: [MaterialDemoDocumentationButton(CupertinoPickerDemo.routeName)], ), body: DefaultTextStyle( style: const TextStyle( diff --git a/examples/flutter_gallery/lib/demo/cupertino/cupertino_refresh_demo.dart b/examples/flutter_gallery/lib/demo/cupertino/cupertino_refresh_demo.dart index 4eaf0e94765..cd4aecf1f14 100644 --- a/examples/flutter_gallery/lib/demo/cupertino/cupertino_refresh_demo.dart +++ b/examples/flutter_gallery/lib/demo/cupertino/cupertino_refresh_demo.dart @@ -6,6 +6,8 @@ import 'dart:math' show Random; import 'package:flutter/cupertino.dart'; +import '../../gallery/demo.dart'; + class CupertinoRefreshControlDemo extends StatefulWidget { static const String routeName = '/cupertino/refresh'; @@ -48,9 +50,10 @@ class _CupertinoRefreshControlDemoState extends State[ - const CupertinoSliverNavigationBar( - largeTitle: Text('Cupertino Refresh'), + CupertinoSliverNavigationBar( + largeTitle: const Text('Cupertino Refresh'), previousPageTitle: 'Cupertino', + trailing: CupertinoDemoDocumentationButton(CupertinoRefreshControlDemo.routeName), ), CupertinoSliverRefreshControl( onRefresh: () { diff --git a/examples/flutter_gallery/lib/demo/cupertino/cupertino_segmented_control_demo.dart b/examples/flutter_gallery/lib/demo/cupertino/cupertino_segmented_control_demo.dart index 5d35281ad55..8d6d0eb3974 100644 --- a/examples/flutter_gallery/lib/demo/cupertino/cupertino_segmented_control_demo.dart +++ b/examples/flutter_gallery/lib/demo/cupertino/cupertino_segmented_control_demo.dart @@ -5,6 +5,8 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import '../../gallery/demo.dart'; + const Color _kKeyUmbraOpacity = Color(0x33000000); // alpha = 0.2 const Color _kKeyPenumbraOpacity = Color(0x24000000); // alpha = 0.14 const Color _kAmbientShadowOpacity = Color(0x1F000000); // alpha = 0.12 @@ -51,6 +53,7 @@ class _CupertinoSegmentedControlDemoState extends State[MaterialDemoDocumentationButton(CupertinoSegmentedControlDemo.routeName)], ), body: Column( children: [ diff --git a/examples/flutter_gallery/lib/demo/cupertino/cupertino_slider_demo.dart b/examples/flutter_gallery/lib/demo/cupertino/cupertino_slider_demo.dart index 79ddb64d55f..40e49a244f0 100644 --- a/examples/flutter_gallery/lib/demo/cupertino/cupertino_slider_demo.dart +++ b/examples/flutter_gallery/lib/demo/cupertino/cupertino_slider_demo.dart @@ -5,6 +5,8 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import '../../gallery/demo.dart'; + class CupertinoSliderDemo extends StatefulWidget { static const String routeName = '/cupertino/slider'; @@ -21,6 +23,7 @@ class _CupertinoSliderDemoState extends State { return Scaffold( appBar: AppBar( title: const Text('Cupertino Sliders'), + actions: [MaterialDemoDocumentationButton(CupertinoSliderDemo.routeName)], ), body: Center( child: Column( diff --git a/examples/flutter_gallery/lib/demo/cupertino/cupertino_switch_demo.dart b/examples/flutter_gallery/lib/demo/cupertino/cupertino_switch_demo.dart index 81998c7a822..077d5dbb56f 100644 --- a/examples/flutter_gallery/lib/demo/cupertino/cupertino_switch_demo.dart +++ b/examples/flutter_gallery/lib/demo/cupertino/cupertino_switch_demo.dart @@ -5,6 +5,8 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import '../../gallery/demo.dart'; + class CupertinoSwitchDemo extends StatefulWidget { static const String routeName = '/cupertino/switch'; @@ -21,6 +23,7 @@ class _CupertinoSwitchDemoState extends State { return Scaffold( appBar: AppBar( title: const Text('Cupertino Switch'), + actions: [MaterialDemoDocumentationButton(CupertinoSwitchDemo.routeName)], ), body: Center( child: Column( diff --git a/examples/flutter_gallery/lib/demo/material/bottom_app_bar_demo.dart b/examples/flutter_gallery/lib/demo/material/bottom_app_bar_demo.dart index 0a68f87ee55..9b1d14dd801 100644 --- a/examples/flutter_gallery/lib/demo/material/bottom_app_bar_demo.dart +++ b/examples/flutter_gallery/lib/demo/material/bottom_app_bar_demo.dart @@ -4,6 +4,8 @@ import 'package:flutter/material.dart'; +import '../../gallery/demo.dart'; + class BottomAppBarDemo extends StatefulWidget { static const String routeName = '/material/bottom_app_bar'; @@ -143,6 +145,7 @@ class _BottomAppBarDemoState extends State { title: const Text('Bottom app bar'), elevation: 0.0, actions: [ + MaterialDemoDocumentationButton(BottomAppBarDemo.routeName), IconButton( icon: const Icon(Icons.sentiment_very_satisfied), onPressed: () { diff --git a/examples/flutter_gallery/lib/demo/material/bottom_navigation_demo.dart b/examples/flutter_gallery/lib/demo/material/bottom_navigation_demo.dart index 85856c1ba56..479c81a85bf 100644 --- a/examples/flutter_gallery/lib/demo/material/bottom_navigation_demo.dart +++ b/examples/flutter_gallery/lib/demo/material/bottom_navigation_demo.dart @@ -4,6 +4,8 @@ import 'package:flutter/material.dart'; +import '../../gallery/demo.dart'; + class NavigationIconView { NavigationIconView({ Widget icon, @@ -209,6 +211,7 @@ class _BottomNavigationDemoState extends State appBar: AppBar( title: const Text('Bottom navigation'), actions: [ + MaterialDemoDocumentationButton(BottomNavigationDemo.routeName), PopupMenuButton( onSelected: (BottomNavigationBarType value) { setState(() { diff --git a/examples/flutter_gallery/lib/demo/material/buttons_demo.dart b/examples/flutter_gallery/lib/demo/material/buttons_demo.dart index 01746cde1dd..a590f1f5246 100644 --- a/examples/flutter_gallery/lib/demo/material/buttons_demo.dart +++ b/examples/flutter_gallery/lib/demo/material/buttons_demo.dart @@ -70,6 +70,7 @@ class _ButtonsDemoState extends State { child: buildRaisedButton(), ), exampleCodeTag: _raisedCode, + documentationUrl: 'https://docs.flutter.io/flutter/material/RaisedButton-class.html', ), ComponentDemoTabData( tabName: 'FLAT', @@ -79,6 +80,7 @@ class _ButtonsDemoState extends State { child: buildFlatButton(), ), exampleCodeTag: _flatCode, + documentationUrl: 'https://docs.flutter.io/flutter/material/FlatButton-class.html', ), ComponentDemoTabData( tabName: 'OUTLINE', @@ -88,24 +90,28 @@ class _ButtonsDemoState extends State { child: buildOutlineButton(), ), exampleCodeTag: _outlineCode, + documentationUrl: 'https://docs.flutter.io/flutter/material/OutlineButton-class.html', ), ComponentDemoTabData( tabName: 'DROPDOWN', description: _dropdownText, demoWidget: buildDropdownButton(), exampleCodeTag: _dropdownCode, + documentationUrl: 'https://docs.flutter.io/flutter/material/DropdownButton-class.html', ), ComponentDemoTabData( tabName: 'ICON', description: _iconText, demoWidget: buildIconButton(), exampleCodeTag: _iconCode, + documentationUrl: 'https://docs.flutter.io/flutter/material/IconButton-class.html', ), ComponentDemoTabData( tabName: 'ACTION', description: _actionText, demoWidget: buildActionButton(), exampleCodeTag: _actionCode, + documentationUrl: 'https://docs.flutter.io/flutter/material/FloatingActionButton-class.html', ), ]; diff --git a/examples/flutter_gallery/lib/demo/material/cards_demo.dart b/examples/flutter_gallery/lib/demo/material/cards_demo.dart index 1d60ea41130..e318eb79de6 100644 --- a/examples/flutter_gallery/lib/demo/material/cards_demo.dart +++ b/examples/flutter_gallery/lib/demo/material/cards_demo.dart @@ -5,6 +5,8 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import '../../gallery/demo.dart'; + const String _kGalleryAssetsPackage = 'flutter_gallery_assets'; class TravelDestination { @@ -168,6 +170,7 @@ class _CardsDemoState extends State { appBar: AppBar( title: const Text('Travel stream'), actions: [ + MaterialDemoDocumentationButton(CardsDemo.routeName), IconButton( icon: const Icon(Icons.sentiment_very_satisfied), onPressed: () { diff --git a/examples/flutter_gallery/lib/demo/material/chip_demo.dart b/examples/flutter_gallery/lib/demo/material/chip_demo.dart index 77a259ebc3e..48be2b1ea68 100644 --- a/examples/flutter_gallery/lib/demo/material/chip_demo.dart +++ b/examples/flutter_gallery/lib/demo/material/chip_demo.dart @@ -4,6 +4,8 @@ import 'package:flutter/material.dart'; +import '../../gallery/demo.dart'; + const List _defaultMaterials = [ 'poker', 'tortilla', @@ -303,6 +305,7 @@ class _ChipDemoState extends State { appBar: AppBar( title: const Text('Chips'), actions: [ + MaterialDemoDocumentationButton(ChipDemo.routeName), IconButton( onPressed: () { setState(() { diff --git a/examples/flutter_gallery/lib/demo/material/data_table_demo.dart b/examples/flutter_gallery/lib/demo/material/data_table_demo.dart index d14cd2564f4..26342b2f784 100644 --- a/examples/flutter_gallery/lib/demo/material/data_table_demo.dart +++ b/examples/flutter_gallery/lib/demo/material/data_table_demo.dart @@ -5,6 +5,8 @@ import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; +import '../../gallery/demo.dart'; + class Dessert { Dessert(this.name, this.calories, this.fat, this.carbs, this.protein, this.sodium, this.calcium, this.iron); final String name; @@ -164,7 +166,12 @@ class _DataTableDemoState extends State { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar(title: const Text('Data tables')), + appBar: AppBar( + title: const Text('Data tables'), + actions: [ + MaterialDemoDocumentationButton(DataTableDemo.routeName), + ], + ), body: ListView( padding: const EdgeInsets.all(20.0), children: [ diff --git a/examples/flutter_gallery/lib/demo/material/date_and_time_picker_demo.dart b/examples/flutter_gallery/lib/demo/material/date_and_time_picker_demo.dart index b62f78e6459..76ccf441e25 100644 --- a/examples/flutter_gallery/lib/demo/material/date_and_time_picker_demo.dart +++ b/examples/flutter_gallery/lib/demo/material/date_and_time_picker_demo.dart @@ -7,6 +7,8 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; +import '../../gallery/demo.dart'; + class _InputDropdown extends StatelessWidget { const _InputDropdown({ Key key, @@ -129,7 +131,10 @@ class _DateAndTimePickerDemoState extends State { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar(title: const Text('Date and time pickers')), + appBar: AppBar( + title: const Text('Date and time pickers'), + actions: [MaterialDemoDocumentationButton(DateAndTimePickerDemo.routeName)], + ), body: DropdownButtonHideUnderline( child: SafeArea( top: false, diff --git a/examples/flutter_gallery/lib/demo/material/dialog_demo.dart b/examples/flutter_gallery/lib/demo/material/dialog_demo.dart index 09c7a02ec38..dc48a7e9a1f 100644 --- a/examples/flutter_gallery/lib/demo/material/dialog_demo.dart +++ b/examples/flutter_gallery/lib/demo/material/dialog_demo.dart @@ -4,6 +4,7 @@ import 'package:flutter/material.dart'; +import '../../gallery/demo.dart'; import 'full_screen_dialog_demo.dart'; enum DialogDemoAction { @@ -87,7 +88,8 @@ class DialogDemoState extends State { return Scaffold( key: _scaffoldKey, appBar: AppBar( - title: const Text('Dialogs') + title: const Text('Dialogs'), + actions: [MaterialDemoDocumentationButton(DialogDemo.routeName)], ), body: ListView( padding: const EdgeInsets.symmetric(vertical: 24.0, horizontal: 72.0), diff --git a/examples/flutter_gallery/lib/demo/material/drawer_demo.dart b/examples/flutter_gallery/lib/demo/material/drawer_demo.dart index fd868af4973..5590fd58fdd 100644 --- a/examples/flutter_gallery/lib/demo/material/drawer_demo.dart +++ b/examples/flutter_gallery/lib/demo/material/drawer_demo.dart @@ -4,6 +4,8 @@ import 'package:flutter/material.dart'; +import '../../gallery/demo.dart'; + const String _kAsset0 = 'people/square/trevor.png'; const String _kAsset1 = 'people/square/stella.png'; const String _kAsset2 = 'people/square/sandra.png'; @@ -88,6 +90,7 @@ class _DrawerDemoState extends State with TickerProviderStateMixin { }, ), title: const Text('Navigation drawer'), + actions: [MaterialDemoDocumentationButton(DrawerDemo.routeName)], ), drawer: Drawer( child: Column( diff --git a/examples/flutter_gallery/lib/demo/material/elevation_demo.dart b/examples/flutter_gallery/lib/demo/material/elevation_demo.dart index 986fc72d882..651854fc2ae 100644 --- a/examples/flutter_gallery/lib/demo/material/elevation_demo.dart +++ b/examples/flutter_gallery/lib/demo/material/elevation_demo.dart @@ -1,5 +1,7 @@ import 'package:flutter/material.dart'; +import '../../gallery/demo.dart'; + class ElevationDemo extends StatefulWidget { static const String routeName = '/material/elevation'; @@ -46,6 +48,7 @@ class _ElevationDemoState extends State { appBar: AppBar( title: const Text('Elevation'), actions: [ + MaterialDemoDocumentationButton(ElevationDemo.routeName), IconButton( icon: const Icon(Icons.sentiment_very_satisfied), onPressed: () { diff --git a/examples/flutter_gallery/lib/demo/material/expansion_panels_demo.dart b/examples/flutter_gallery/lib/demo/material/expansion_panels_demo.dart index 6fd07e1283a..861d578b51f 100644 --- a/examples/flutter_gallery/lib/demo/material/expansion_panels_demo.dart +++ b/examples/flutter_gallery/lib/demo/material/expansion_panels_demo.dart @@ -4,6 +4,8 @@ import 'package:flutter/material.dart'; +import '../../gallery/demo.dart'; + enum _Location { Barbados, Bahamas, @@ -336,7 +338,12 @@ class _ExpansionPanelsDemoState extends State { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar(title: const Text('Expansion panels')), + appBar: AppBar( + title: const Text('Expansion panels'), + actions: [ + MaterialDemoDocumentationButton(ExpansionPanelsDemo.routeName), + ], + ), body: SingleChildScrollView( child: SafeArea( top: false, diff --git a/examples/flutter_gallery/lib/demo/material/grid_list_demo.dart b/examples/flutter_gallery/lib/demo/material/grid_list_demo.dart index cb9661f032d..e6f2c609684 100644 --- a/examples/flutter_gallery/lib/demo/material/grid_list_demo.dart +++ b/examples/flutter_gallery/lib/demo/material/grid_list_demo.dart @@ -4,6 +4,8 @@ import 'package:flutter/material.dart'; +import '../../gallery/demo.dart'; + enum GridDemoTileStyle { imageOnly, oneLine, @@ -340,6 +342,7 @@ class GridListDemoState extends State { appBar: AppBar( title: const Text('Grid list'), actions: [ + MaterialDemoDocumentationButton(GridListDemo.routeName), PopupMenuButton( onSelected: changeTileStyle, itemBuilder: (BuildContext context) => >[ diff --git a/examples/flutter_gallery/lib/demo/material/icons_demo.dart b/examples/flutter_gallery/lib/demo/material/icons_demo.dart index 60bd9c597ed..ba452ae5981 100644 --- a/examples/flutter_gallery/lib/demo/material/icons_demo.dart +++ b/examples/flutter_gallery/lib/demo/material/icons_demo.dart @@ -4,6 +4,8 @@ import 'package:flutter/material.dart'; +import '../../gallery/demo.dart'; + class IconsDemo extends StatefulWidget { static const String routeName = '/material/icons'; @@ -48,7 +50,8 @@ class IconsDemoState extends State { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: const Text('Icons') + title: const Text('Icons'), + actions: [MaterialDemoDocumentationButton(IconsDemo.routeName)], ), body: IconTheme( data: IconThemeData(color: iconColor), diff --git a/examples/flutter_gallery/lib/demo/material/leave_behind_demo.dart b/examples/flutter_gallery/lib/demo/material/leave_behind_demo.dart index d85b1e02b25..3cce01a3c3b 100644 --- a/examples/flutter_gallery/lib/demo/material/leave_behind_demo.dart +++ b/examples/flutter_gallery/lib/demo/material/leave_behind_demo.dart @@ -7,6 +7,8 @@ import 'package:collection/collection.dart' show lowerBound; import 'package:flutter/material.dart'; import 'package:flutter/semantics.dart'; +import '../../gallery/demo.dart'; + enum LeaveBehindDemoAction { reset, horizontalSwipe, @@ -140,6 +142,7 @@ class LeaveBehindDemoState extends State { appBar: AppBar( title: const Text('Swipe to dismiss'), actions: [ + MaterialDemoDocumentationButton(LeaveBehindDemo.routeName), PopupMenuButton( onSelected: handleDemoAction, itemBuilder: (BuildContext context) => >[ diff --git a/examples/flutter_gallery/lib/demo/material/list_demo.dart b/examples/flutter_gallery/lib/demo/material/list_demo.dart index 2353f02b6be..a3fdb96c76e 100644 --- a/examples/flutter_gallery/lib/demo/material/list_demo.dart +++ b/examples/flutter_gallery/lib/demo/material/list_demo.dart @@ -4,6 +4,8 @@ import 'package:flutter/material.dart'; +import '../../gallery/demo.dart'; + enum _MaterialListType { /// A list tile that contains a single line of text. oneLine, @@ -216,6 +218,7 @@ class _ListDemoState extends State { appBar: AppBar( title: Text('Scrolling list\n$itemTypeText$layoutText'), actions: [ + MaterialDemoDocumentationButton(ListDemo.routeName), IconButton( icon: const Icon(Icons.sort_by_alpha), tooltip: 'Sort', diff --git a/examples/flutter_gallery/lib/demo/material/menu_demo.dart b/examples/flutter_gallery/lib/demo/material/menu_demo.dart index 3d0f4a3b84e..20b55dad917 100644 --- a/examples/flutter_gallery/lib/demo/material/menu_demo.dart +++ b/examples/flutter_gallery/lib/demo/material/menu_demo.dart @@ -4,6 +4,8 @@ import 'package:flutter/material.dart'; +import '../../gallery/demo.dart'; + class MenuDemo extends StatefulWidget { const MenuDemo({ Key key }) : super(key: key); @@ -64,6 +66,7 @@ class MenuDemoState extends State { appBar: AppBar( title: const Text('Menus'), actions: [ + MaterialDemoDocumentationButton(MenuDemo.routeName), PopupMenuButton( onSelected: showMenuSelection, itemBuilder: (BuildContext context) => >[ diff --git a/examples/flutter_gallery/lib/demo/material/modal_bottom_sheet_demo.dart b/examples/flutter_gallery/lib/demo/material/modal_bottom_sheet_demo.dart index ce4f081d5f0..127eba5f281 100644 --- a/examples/flutter_gallery/lib/demo/material/modal_bottom_sheet_demo.dart +++ b/examples/flutter_gallery/lib/demo/material/modal_bottom_sheet_demo.dart @@ -4,13 +4,18 @@ import 'package:flutter/material.dart'; +import '../../gallery/demo.dart'; + class ModalBottomSheetDemo extends StatelessWidget { static const String routeName = '/material/modal-bottom-sheet'; @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar(title: const Text('Modal bottom sheet')), + appBar: AppBar( + title: const Text('Modal bottom sheet'), + actions: [MaterialDemoDocumentationButton(routeName)], + ), body: Center( child: RaisedButton( child: const Text('SHOW BOTTOM SHEET'), diff --git a/examples/flutter_gallery/lib/demo/material/overscroll_demo.dart b/examples/flutter_gallery/lib/demo/material/overscroll_demo.dart index 5b4939f893f..6720de9f90e 100644 --- a/examples/flutter_gallery/lib/demo/material/overscroll_demo.dart +++ b/examples/flutter_gallery/lib/demo/material/overscroll_demo.dart @@ -6,6 +6,8 @@ import 'dart:async'; import 'package:flutter/material.dart'; +import '../../gallery/demo.dart'; + enum IndicatorType { overscroll, refresh } class OverscrollDemo extends StatefulWidget { @@ -47,6 +49,7 @@ class OverscrollDemoState extends State { appBar: AppBar( title: const Text('Pull to refresh'), actions: [ + MaterialDemoDocumentationButton(OverscrollDemo.routeName), IconButton( icon: const Icon(Icons.refresh), tooltip: 'Refresh', diff --git a/examples/flutter_gallery/lib/demo/material/page_selector_demo.dart b/examples/flutter_gallery/lib/demo/material/page_selector_demo.dart index 2f3b67d37d6..3c9a47ceb39 100644 --- a/examples/flutter_gallery/lib/demo/material/page_selector_demo.dart +++ b/examples/flutter_gallery/lib/demo/material/page_selector_demo.dart @@ -4,6 +4,8 @@ import 'package:flutter/material.dart'; +import '../../gallery/demo.dart'; + class _PageSelector extends StatelessWidget { const _PageSelector({ this.icons }); @@ -85,7 +87,10 @@ class PageSelectorDemo extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar(title: const Text('Page selector')), + appBar: AppBar( + title: const Text('Page selector'), + actions: [MaterialDemoDocumentationButton(routeName)], + ), body: DefaultTabController( length: icons.length, child: _PageSelector(icons: icons), diff --git a/examples/flutter_gallery/lib/demo/material/persistent_bottom_sheet_demo.dart b/examples/flutter_gallery/lib/demo/material/persistent_bottom_sheet_demo.dart index 090a4aee9bf..b244989c8a5 100644 --- a/examples/flutter_gallery/lib/demo/material/persistent_bottom_sheet_demo.dart +++ b/examples/flutter_gallery/lib/demo/material/persistent_bottom_sheet_demo.dart @@ -4,6 +4,8 @@ import 'package:flutter/material.dart'; +import '../../gallery/demo.dart'; + class PersistentBottomSheetDemo extends StatefulWidget { static const String routeName = '/material/persistent-bottom-sheet'; @@ -76,7 +78,12 @@ class _PersistentBottomSheetDemoState extends State { Widget build(BuildContext context) { return Scaffold( key: _scaffoldKey, - appBar: AppBar(title: const Text('Persistent bottom sheet')), + appBar: AppBar( + title: const Text('Persistent bottom sheet'), + actions: [ + MaterialDemoDocumentationButton(PersistentBottomSheetDemo.routeName), + ], + ), floatingActionButton: FloatingActionButton( onPressed: _showMessage, backgroundColor: Colors.redAccent, diff --git a/examples/flutter_gallery/lib/demo/material/progress_indicator_demo.dart b/examples/flutter_gallery/lib/demo/material/progress_indicator_demo.dart index 2035739ed08..cdd086f510f 100644 --- a/examples/flutter_gallery/lib/demo/material/progress_indicator_demo.dart +++ b/examples/flutter_gallery/lib/demo/material/progress_indicator_demo.dart @@ -4,6 +4,8 @@ import 'package:flutter/material.dart'; +import '../../gallery/demo.dart'; + class ProgressIndicatorDemo extends StatefulWidget { static const String routeName = '/material/progress-indicator'; @@ -100,7 +102,10 @@ class _ProgressIndicatorDemoState extends State with Sing @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar(title: const Text('Progress indicators')), + appBar: AppBar( + title: const Text('Progress indicators'), + actions: [MaterialDemoDocumentationButton(ProgressIndicatorDemo.routeName)], + ), body: Center( child: SingleChildScrollView( child: DefaultTextStyle( diff --git a/examples/flutter_gallery/lib/demo/material/reorderable_list_demo.dart b/examples/flutter_gallery/lib/demo/material/reorderable_list_demo.dart index f71666f24e4..af386a7dd91 100644 --- a/examples/flutter_gallery/lib/demo/material/reorderable_list_demo.dart +++ b/examples/flutter_gallery/lib/demo/material/reorderable_list_demo.dart @@ -6,6 +6,8 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; +import '../../gallery/demo.dart'; + enum _ReorderableListType { /// A list tile that contains a [CircleAvatar]. horizontalAvatar, @@ -157,6 +159,7 @@ class _ListDemoState extends State { appBar: AppBar( title: const Text('Reorderable list'), actions: [ + MaterialDemoDocumentationButton(ReorderableListDemo.routeName), IconButton( icon: const Icon(Icons.sort_by_alpha), tooltip: 'Sort', diff --git a/examples/flutter_gallery/lib/demo/material/scrollable_tabs_demo.dart b/examples/flutter_gallery/lib/demo/material/scrollable_tabs_demo.dart index 38d65181271..2d2364888f2 100644 --- a/examples/flutter_gallery/lib/demo/material/scrollable_tabs_demo.dart +++ b/examples/flutter_gallery/lib/demo/material/scrollable_tabs_demo.dart @@ -4,6 +4,8 @@ import 'package:flutter/material.dart'; +import '../../gallery/demo.dart'; + enum TabsDemoStyle { iconsAndText, iconsOnly, @@ -125,6 +127,7 @@ class ScrollableTabsDemoState extends State with SingleTicke appBar: AppBar( title: const Text('Scrollable tabs'), actions: [ + MaterialDemoDocumentationButton(ScrollableTabsDemo.routeName), IconButton( icon: const Icon(Icons.sentiment_very_satisfied), onPressed: () { diff --git a/examples/flutter_gallery/lib/demo/material/search_demo.dart b/examples/flutter_gallery/lib/demo/material/search_demo.dart index e22cb2670d7..afc618616cf 100644 --- a/examples/flutter_gallery/lib/demo/material/search_demo.dart +++ b/examples/flutter_gallery/lib/demo/material/search_demo.dart @@ -4,6 +4,8 @@ import 'package:flutter/material.dart'; +import '../../gallery/demo.dart'; + class SearchDemo extends StatefulWidget { static const String routeName = '/material/search'; @@ -50,6 +52,7 @@ class _SearchDemoState extends State { } }, ), + MaterialDemoDocumentationButton(SearchDemo.routeName), IconButton( tooltip: 'More (not implemented)', icon: Icon( diff --git a/examples/flutter_gallery/lib/demo/material/selection_controls_demo.dart b/examples/flutter_gallery/lib/demo/material/selection_controls_demo.dart index a4919a3be23..6f8be196e0c 100644 --- a/examples/flutter_gallery/lib/demo/material/selection_controls_demo.dart +++ b/examples/flutter_gallery/lib/demo/material/selection_controls_demo.dart @@ -42,19 +42,22 @@ class _SelectionControlsDemoState extends State { tabName: 'CHECKBOX', description: _checkboxText, demoWidget: buildCheckbox(), - exampleCodeTag: _checkboxCode + exampleCodeTag: _checkboxCode, + documentationUrl: 'https://docs.flutter.io/flutter/material/Checkbox-class.html', ), ComponentDemoTabData( tabName: 'RADIO', description: _radioText, demoWidget: buildRadio(), - exampleCodeTag: _radioCode + exampleCodeTag: _radioCode, + documentationUrl: 'https://docs.flutter.io/flutter/material/Radio-class.html', ), ComponentDemoTabData( tabName: 'SWITCH', description: _switchText, demoWidget: buildSwitch(), - exampleCodeTag: _switchCode + exampleCodeTag: _switchCode, + documentationUrl: 'https://docs.flutter.io/flutter/material/Switch-class.html', ) ]; diff --git a/examples/flutter_gallery/lib/demo/material/slider_demo.dart b/examples/flutter_gallery/lib/demo/material/slider_demo.dart index 73065876e7c..1c28d1fe2f2 100644 --- a/examples/flutter_gallery/lib/demo/material/slider_demo.dart +++ b/examples/flutter_gallery/lib/demo/material/slider_demo.dart @@ -6,6 +6,8 @@ import 'dart:math' as math; import 'package:flutter/material.dart'; +import '../../gallery/demo.dart'; + class SliderDemo extends StatefulWidget { static const String routeName = '/material/slider'; @@ -132,7 +134,10 @@ class _SliderDemoState extends State { Widget build(BuildContext context) { final ThemeData theme = Theme.of(context); return Scaffold( - appBar: AppBar(title: const Text('Sliders')), + appBar: AppBar( + title: const Text('Sliders'), + actions: [MaterialDemoDocumentationButton(SliderDemo.routeName)], + ), body: Padding( padding: const EdgeInsets.symmetric(horizontal: 40.0), child: Column( diff --git a/examples/flutter_gallery/lib/demo/material/snack_bar_demo.dart b/examples/flutter_gallery/lib/demo/material/snack_bar_demo.dart index 17fe78d6b2d..830ceba09b8 100644 --- a/examples/flutter_gallery/lib/demo/material/snack_bar_demo.dart +++ b/examples/flutter_gallery/lib/demo/material/snack_bar_demo.dart @@ -4,6 +4,8 @@ import 'package:flutter/material.dart'; +import '../../gallery/demo.dart'; + const String _text1 = 'Snackbars provide lightweight feedback about an operation by ' 'showing a brief message at the bottom of the screen. Snackbars ' @@ -73,7 +75,8 @@ class _SnackBarDemoState extends State { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: const Text('Snackbar') + title: const Text('Snackbar'), + actions: [MaterialDemoDocumentationButton(SnackBarDemo.routeName)], ), body: Builder( // Create an inner BuildContext so that the snackBar onPressed methods diff --git a/examples/flutter_gallery/lib/demo/material/tabs_demo.dart b/examples/flutter_gallery/lib/demo/material/tabs_demo.dart index f32cf8549e5..5cdfdcbb3a0 100644 --- a/examples/flutter_gallery/lib/demo/material/tabs_demo.dart +++ b/examples/flutter_gallery/lib/demo/material/tabs_demo.dart @@ -4,6 +4,8 @@ import 'package:flutter/material.dart'; +import '../../gallery/demo.dart'; + // Each TabBarView contains a _Page and for each _Page there is a list // of _CardData objects. Each _CardData object is displayed by a _CardItem. @@ -150,6 +152,7 @@ class TabsDemo extends StatelessWidget { handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context), child: SliverAppBar( title: const Text('Tabs and scrolling'), + actions: [MaterialDemoDocumentationButton(routeName)], pinned: true, expandedHeight: 150.0, forceElevated: innerBoxIsScrolled, diff --git a/examples/flutter_gallery/lib/demo/material/tabs_fab_demo.dart b/examples/flutter_gallery/lib/demo/material/tabs_fab_demo.dart index f0286012272..2a7371a9348 100644 --- a/examples/flutter_gallery/lib/demo/material/tabs_fab_demo.dart +++ b/examples/flutter_gallery/lib/demo/material/tabs_fab_demo.dart @@ -4,6 +4,8 @@ import 'package:flutter/material.dart'; +import '../../gallery/demo.dart'; + const String _explanatoryText = "When the Scaffold's floating action button changes, the new button fades and " 'turns into view. In this demo, changing tabs can cause the app to be rebuilt ' @@ -137,6 +139,7 @@ class _TabsFabDemoState extends State with SingleTickerProviderStat tabs: _allPages.map((_Page page) => Tab(text: page.label.toUpperCase())).toList(), ), actions: [ + MaterialDemoDocumentationButton(TabsFabDemo.routeName), IconButton( icon: const Icon(Icons.sentiment_very_satisfied), onPressed: () { diff --git a/examples/flutter_gallery/lib/demo/material/text_form_field_demo.dart b/examples/flutter_gallery/lib/demo/material/text_form_field_demo.dart index afa90243f03..bcaa216094c 100644 --- a/examples/flutter_gallery/lib/demo/material/text_form_field_demo.dart +++ b/examples/flutter_gallery/lib/demo/material/text_form_field_demo.dart @@ -7,6 +7,8 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import '../../gallery/demo.dart'; + class TextFormFieldDemo extends StatefulWidget { const TextFormFieldDemo({ Key key }) : super(key: key); @@ -165,6 +167,7 @@ class TextFormFieldDemoState extends State { key: _scaffoldKey, appBar: AppBar( title: const Text('Text fields'), + actions: [MaterialDemoDocumentationButton(TextFormFieldDemo.routeName)], ), body: SafeArea( top: false, diff --git a/examples/flutter_gallery/lib/demo/material/tooltip_demo.dart b/examples/flutter_gallery/lib/demo/material/tooltip_demo.dart index b2584097a8b..69639085d9e 100644 --- a/examples/flutter_gallery/lib/demo/material/tooltip_demo.dart +++ b/examples/flutter_gallery/lib/demo/material/tooltip_demo.dart @@ -4,6 +4,8 @@ import 'package:flutter/material.dart'; +import '../../gallery/demo.dart'; + const String _introText = 'Tooltips are short identifying messages that briefly appear in response to ' 'a long press. Tooltip messages are also used by services that make Flutter ' @@ -18,7 +20,8 @@ class TooltipDemo extends StatelessWidget { final ThemeData theme = Theme.of(context); return Scaffold( appBar: AppBar( - title: const Text('Tooltips') + title: const Text('Tooltips'), + actions: [MaterialDemoDocumentationButton(routeName)], ), body: Builder( builder: (BuildContext context) { diff --git a/examples/flutter_gallery/lib/demo/material/two_level_list_demo.dart b/examples/flutter_gallery/lib/demo/material/two_level_list_demo.dart index 3f8d9f3e87a..594839d07aa 100644 --- a/examples/flutter_gallery/lib/demo/material/two_level_list_demo.dart +++ b/examples/flutter_gallery/lib/demo/material/two_level_list_demo.dart @@ -4,13 +4,18 @@ import 'package:flutter/material.dart'; +import '../../gallery/demo.dart'; + class TwoLevelListDemo extends StatelessWidget { static const String routeName = '/material/two-level-list'; @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar(title: const Text('Expand/collapse list control')), + appBar: AppBar( + title: const Text('Expand/collapse list control'), + actions: [MaterialDemoDocumentationButton(routeName)], + ), body: ListView( children: [ const ListTile(title: Text('Top')), diff --git a/examples/flutter_gallery/lib/gallery/demo.dart b/examples/flutter_gallery/lib/gallery/demo.dart index 67cc019c46d..d6e11683c52 100644 --- a/examples/flutter_gallery/lib/gallery/demo.dart +++ b/examples/flutter_gallery/lib/gallery/demo.dart @@ -2,8 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:url_launcher/url_launcher.dart'; +import 'demos.dart'; import 'example_code_parser.dart'; import 'syntax_highlighter.dart'; @@ -12,24 +15,28 @@ class ComponentDemoTabData { this.demoWidget, this.exampleCodeTag, this.description, - this.tabName + this.tabName, + this.documentationUrl, }); final Widget demoWidget; final String exampleCodeTag; final String description; final String tabName; + final String documentationUrl; @override bool operator==(Object other) { if (other.runtimeType != runtimeType) return false; final ComponentDemoTabData typedOther = other; - return typedOther.tabName == tabName && typedOther.description == description; + return typedOther.tabName == tabName + && typedOther.description == description + && typedOther.documentationUrl == documentationUrl; } @override - int get hashCode => hashValues(tabName.hashCode, description.hashCode); + int get hashCode => hashValues(tabName, description, documentationUrl); } class TabbedComponentDemoScaffold extends StatelessWidget { @@ -52,6 +59,13 @@ class TabbedComponentDemoScaffold extends StatelessWidget { } } + void _showApiDocumentation(BuildContext context) { + final String url = demos[DefaultTabController.of(context).index].documentationUrl; + if (url != null) { + launch(url, forceWebView: true); + } + } + @override Widget build(BuildContext context) { return DefaultTabController( @@ -61,14 +75,20 @@ class TabbedComponentDemoScaffold extends StatelessWidget { title: Text(title), actions: (actions ?? [])..addAll( [ + Builder( + builder: (BuildContext context) { + return IconButton( + icon: const Icon(Icons.library_books), + onPressed: () => _showApiDocumentation(context), + ); + }, + ), Builder( builder: (BuildContext context) { return IconButton( icon: const Icon(Icons.code), tooltip: 'Show example code', - onPressed: () { - _showExampleCode(context); - }, + onPressed: () => _showExampleCode(context), ); }, ) @@ -170,3 +190,44 @@ class FullScreenCodeDialogState extends State { ); } } + +class MaterialDemoDocumentationButton extends StatelessWidget { + MaterialDemoDocumentationButton(String routeName, { Key key }) + : documentationUrl = kDemoDocumentationUrl[routeName], + assert( + kDemoDocumentationUrl[routeName] != null, + 'A documentation URL was not specified for demo route $routeName in kAllGalleryDemos', + ), + super(key: key); + + final String documentationUrl; + + @override + Widget build(BuildContext context) { + return IconButton( + icon: const Icon(Icons.library_books), + onPressed: () => launch(documentationUrl, forceWebView: true) + ); + } +} + +class CupertinoDemoDocumentationButton extends StatelessWidget { + CupertinoDemoDocumentationButton(String routeName, { Key key }) + : documentationUrl = kDemoDocumentationUrl[routeName], + assert( + kDemoDocumentationUrl[routeName] != null, + 'A documentation URL was not specified for demo route $routeName in kAllGalleryDemos', + ), + super(key: key); + + final String documentationUrl; + + @override + Widget build(BuildContext context) { + return CupertinoButton( + padding: EdgeInsets.zero, + child: const Icon(CupertinoIcons.book), + onPressed: () => launch(documentationUrl, forceWebView: true) + ); + } +} diff --git a/examples/flutter_gallery/lib/gallery/demos.dart b/examples/flutter_gallery/lib/gallery/demos.dart index ee7eeea021b..2f1064a288e 100644 --- a/examples/flutter_gallery/lib/gallery/demos.dart +++ b/examples/flutter_gallery/lib/gallery/demos.dart @@ -63,6 +63,7 @@ class GalleryDemo { this.subtitle, @required this.category, @required this.routeName, + this.documentationUrl, @required this.buildRoute, }) : assert(title != null), assert(category != null), @@ -75,6 +76,7 @@ class GalleryDemo { final GalleryDemoCategory category; final String routeName; final WidgetBuilder buildRoute; + final String documentationUrl; @override String toString() { @@ -143,6 +145,7 @@ List _buildGalleryDemos() { icon: GalleryIcons.bottom_app_bar, category: _kMaterialComponents, routeName: BottomAppBarDemo.routeName, + documentationUrl: 'https://docs.flutter.io/flutter/material/BottomAppBar-class.html', buildRoute: (BuildContext context) => BottomAppBarDemo(), ), GalleryDemo( @@ -151,6 +154,7 @@ List _buildGalleryDemos() { icon: GalleryIcons.bottom_navigation, category: _kMaterialComponents, routeName: BottomNavigationDemo.routeName, + documentationUrl: 'https://docs.flutter.io/flutter/material/BottomNavigationBar-class.html', buildRoute: (BuildContext context) => BottomNavigationDemo(), ), GalleryDemo( @@ -159,6 +163,7 @@ List _buildGalleryDemos() { icon: GalleryIcons.bottom_sheets, category: _kMaterialComponents, routeName: ModalBottomSheetDemo.routeName, + documentationUrl: 'https://docs.flutter.io/flutter/material/showModalBottomSheet.html', buildRoute: (BuildContext context) => ModalBottomSheetDemo(), ), GalleryDemo( @@ -167,6 +172,7 @@ List _buildGalleryDemos() { icon: GalleryIcons.bottom_sheet_persistent, category: _kMaterialComponents, routeName: PersistentBottomSheetDemo.routeName, + documentationUrl: 'https://docs.flutter.io/flutter/material/ScaffoldState/showBottomSheet.html', buildRoute: (BuildContext context) => PersistentBottomSheetDemo(), ), GalleryDemo( @@ -183,6 +189,7 @@ List _buildGalleryDemos() { icon: GalleryIcons.buttons, category: _kMaterialComponents, routeName: TabsFabDemo.routeName, + documentationUrl: 'https://docs.flutter.io/flutter/material/FloatingActionButton-class.html', buildRoute: (BuildContext context) => TabsFabDemo(), ), GalleryDemo( @@ -191,6 +198,7 @@ List _buildGalleryDemos() { icon: GalleryIcons.cards, category: _kMaterialComponents, routeName: CardsDemo.routeName, + documentationUrl: 'https://docs.flutter.io/flutter/material/Card-class.html', buildRoute: (BuildContext context) => CardsDemo(), ), GalleryDemo( @@ -199,6 +207,7 @@ List _buildGalleryDemos() { icon: GalleryIcons.chips, category: _kMaterialComponents, routeName: ChipDemo.routeName, + documentationUrl: 'https://docs.flutter.io/flutter/material/Chip-class.html', buildRoute: (BuildContext context) => ChipDemo(), ), GalleryDemo( @@ -207,6 +216,7 @@ List _buildGalleryDemos() { icon: GalleryIcons.data_table, category: _kMaterialComponents, routeName: DataTableDemo.routeName, + documentationUrl: 'https://docs.flutter.io/flutter/material/PaginatedDataTable-class.html', buildRoute: (BuildContext context) => DataTableDemo(), ), GalleryDemo( @@ -215,6 +225,7 @@ List _buildGalleryDemos() { icon: GalleryIcons.dialogs, category: _kMaterialComponents, routeName: DialogDemo.routeName, + documentationUrl: 'https://docs.flutter.io/flutter/material/showDialog.html', buildRoute: (BuildContext context) => DialogDemo(), ), GalleryDemo( @@ -224,6 +235,7 @@ List _buildGalleryDemos() { icon: GalleryIcons.cupertino_progress, category: _kMaterialComponents, routeName: ElevationDemo.routeName, + documentationUrl: 'https://docs.flutter.io/flutter/material/Material/elevation.html', buildRoute: (BuildContext context) => ElevationDemo(), ), GalleryDemo( @@ -232,6 +244,7 @@ List _buildGalleryDemos() { icon: GalleryIcons.expand_all, category: _kMaterialComponents, routeName: TwoLevelListDemo.routeName, + documentationUrl: 'https://docs.flutter.io/flutter/material/ExpansionTile-class.html', buildRoute: (BuildContext context) => TwoLevelListDemo(), ), GalleryDemo( @@ -240,6 +253,7 @@ List _buildGalleryDemos() { icon: GalleryIcons.expand_all, category: _kMaterialComponents, routeName: ExpansionPanelsDemo.routeName, + documentationUrl: 'https://docs.flutter.io/flutter/material/ExpansionPanel-class.html', buildRoute: (BuildContext context) => ExpansionPanelsDemo(), ), GalleryDemo( @@ -248,6 +262,7 @@ List _buildGalleryDemos() { icon: GalleryIcons.grid_on, category: _kMaterialComponents, routeName: GridListDemo.routeName, + documentationUrl: 'https://docs.flutter.io/flutter/widgets/GridView-class.html', buildRoute: (BuildContext context) => const GridListDemo(), ), GalleryDemo( @@ -256,6 +271,7 @@ List _buildGalleryDemos() { icon: GalleryIcons.sentiment_very_satisfied, category: _kMaterialComponents, routeName: IconsDemo.routeName, + documentationUrl: 'https://docs.flutter.io/flutter/material/IconButton-class.html', buildRoute: (BuildContext context) => IconsDemo(), ), GalleryDemo( @@ -264,6 +280,7 @@ List _buildGalleryDemos() { icon: GalleryIcons.list_alt, category: _kMaterialComponents, routeName: ListDemo.routeName, + documentationUrl: 'https://docs.flutter.io/flutter/material/ListTile-class.html', buildRoute: (BuildContext context) => const ListDemo(), ), GalleryDemo( @@ -272,6 +289,7 @@ List _buildGalleryDemos() { icon: GalleryIcons.lists_leave_behind, category: _kMaterialComponents, routeName: LeaveBehindDemo.routeName, + documentationUrl: 'https://docs.flutter.io/flutter/widgets/Dismissible-class.html', buildRoute: (BuildContext context) => const LeaveBehindDemo(), ), GalleryDemo( @@ -280,6 +298,7 @@ List _buildGalleryDemos() { icon: GalleryIcons.list_alt, category: _kMaterialComponents, routeName: ReorderableListDemo.routeName, + documentationUrl: 'https://docs.flutter.io/flutter/material/ReorderableListView-class.html', buildRoute: (BuildContext context) => const ReorderableListDemo(), ), GalleryDemo( @@ -288,6 +307,7 @@ List _buildGalleryDemos() { icon: GalleryIcons.more_vert, category: _kMaterialComponents, routeName: MenuDemo.routeName, + documentationUrl: 'https://docs.flutter.io/flutter/material/PopupMenuButton-class.html', buildRoute: (BuildContext context) => const MenuDemo(), ), GalleryDemo( @@ -296,6 +316,7 @@ List _buildGalleryDemos() { icon: GalleryIcons.menu, category: _kMaterialComponents, routeName: DrawerDemo.routeName, + documentationUrl: 'https://docs.flutter.io/flutter/material/Drawer-class.html', buildRoute: (BuildContext context) => DrawerDemo(), ), GalleryDemo( @@ -304,6 +325,7 @@ List _buildGalleryDemos() { icon: GalleryIcons.page_control, category: _kMaterialComponents, routeName: PageSelectorDemo.routeName, + documentationUrl: 'https://docs.flutter.io/flutter/material/TabBarView-class.html', buildRoute: (BuildContext context) => PageSelectorDemo(), ), GalleryDemo( @@ -312,6 +334,7 @@ List _buildGalleryDemos() { icon: GalleryIcons.event, category: _kMaterialComponents, routeName: DateAndTimePickerDemo.routeName, + documentationUrl: 'https://docs.flutter.io/flutter/material/showDatePicker.html', buildRoute: (BuildContext context) => DateAndTimePickerDemo(), ), GalleryDemo( @@ -320,6 +343,7 @@ List _buildGalleryDemos() { icon: GalleryIcons.progress_activity, category: _kMaterialComponents, routeName: ProgressIndicatorDemo.routeName, + documentationUrl: 'https://docs.flutter.io/flutter/material/LinearProgressIndicator-class.html', buildRoute: (BuildContext context) => ProgressIndicatorDemo(), ), GalleryDemo( @@ -328,6 +352,7 @@ List _buildGalleryDemos() { icon: GalleryIcons.refresh, category: _kMaterialComponents, routeName: OverscrollDemo.routeName, + documentationUrl: 'https://docs.flutter.io/flutter/material/RefreshIndicator-class.html', buildRoute: (BuildContext context) => const OverscrollDemo(), ), GalleryDemo( @@ -336,6 +361,7 @@ List _buildGalleryDemos() { icon: Icons.search, category: _kMaterialComponents, routeName: SearchDemo.routeName, + documentationUrl: 'https://docs.flutter.io/flutter/material/showSearch.html', buildRoute: (BuildContext context) => SearchDemo(), ), GalleryDemo( @@ -352,6 +378,7 @@ List _buildGalleryDemos() { icon: GalleryIcons.sliders, category: _kMaterialComponents, routeName: SliderDemo.routeName, + documentationUrl: 'https://docs.flutter.io/flutter/material/Slider-class.html', buildRoute: (BuildContext context) => SliderDemo(), ), GalleryDemo( @@ -360,6 +387,7 @@ List _buildGalleryDemos() { icon: GalleryIcons.snackbar, category: _kMaterialComponents, routeName: SnackBarDemo.routeName, + documentationUrl: 'https://docs.flutter.io/flutter/material/ScaffoldState/showSnackBar.html', buildRoute: (BuildContext context) => const SnackBarDemo(), ), GalleryDemo( @@ -368,6 +396,7 @@ List _buildGalleryDemos() { icon: GalleryIcons.tabs, category: _kMaterialComponents, routeName: TabsDemo.routeName, + documentationUrl: 'https://docs.flutter.io/flutter/material/TabBarView-class.html', buildRoute: (BuildContext context) => TabsDemo(), ), GalleryDemo( @@ -376,6 +405,7 @@ List _buildGalleryDemos() { category: _kMaterialComponents, icon: GalleryIcons.tabs, routeName: ScrollableTabsDemo.routeName, + documentationUrl: 'https://docs.flutter.io/flutter/material/TabBar-class.html', buildRoute: (BuildContext context) => ScrollableTabsDemo(), ), GalleryDemo( @@ -384,6 +414,7 @@ List _buildGalleryDemos() { icon: GalleryIcons.text_fields_alt, category: _kMaterialComponents, routeName: TextFormFieldDemo.routeName, + documentationUrl: 'https://docs.flutter.io/flutter/material/TextFormField-class.html', buildRoute: (BuildContext context) => const TextFormFieldDemo(), ), GalleryDemo( @@ -392,6 +423,7 @@ List _buildGalleryDemos() { icon: GalleryIcons.tooltip, category: _kMaterialComponents, routeName: TooltipDemo.routeName, + documentationUrl: 'https://docs.flutter.io/flutter/material/Tooltip-class.html', buildRoute: (BuildContext context) => TooltipDemo(), ), @@ -401,6 +433,7 @@ List _buildGalleryDemos() { icon: GalleryIcons.cupertino_progress, category: _kCupertinoComponents, routeName: CupertinoProgressIndicatorDemo.routeName, + documentationUrl: 'https://docs.flutter.io/flutter/cupertino/CupertinoActivityIndicator-class.html', buildRoute: (BuildContext context) => CupertinoProgressIndicatorDemo(), ), GalleryDemo( @@ -408,6 +441,7 @@ List _buildGalleryDemos() { icon: GalleryIcons.dialogs, category: _kCupertinoComponents, routeName: CupertinoAlertDemo.routeName, + documentationUrl: 'https://docs.flutter.io/flutter/cupertino/showCupertinoDialog.html', buildRoute: (BuildContext context) => CupertinoAlertDemo(), ), GalleryDemo( @@ -415,6 +449,7 @@ List _buildGalleryDemos() { icon: GalleryIcons.generic_buttons, category: _kCupertinoComponents, routeName: CupertinoButtonsDemo.routeName, + documentationUrl: 'https://docs.flutter.io/flutter/cupertino/CupertinoButton-class.html', buildRoute: (BuildContext context) => CupertinoButtonsDemo(), ), GalleryDemo( @@ -422,6 +457,7 @@ List _buildGalleryDemos() { icon: GalleryIcons.bottom_navigation, category: _kCupertinoComponents, routeName: CupertinoNavigationDemo.routeName, + documentationUrl: 'https://docs.flutter.io/flutter/cupertino/CupertinoTabScaffold-class.html', buildRoute: (BuildContext context) => CupertinoNavigationDemo(), ), GalleryDemo( @@ -429,6 +465,7 @@ List _buildGalleryDemos() { icon: GalleryIcons.event, category: _kCupertinoComponents, routeName: CupertinoPickerDemo.routeName, + documentationUrl: 'https://docs.flutter.io/flutter/cupertino/CupertinoPicker-class.html', buildRoute: (BuildContext context) => CupertinoPickerDemo(), ), GalleryDemo( @@ -436,6 +473,7 @@ List _buildGalleryDemos() { icon: GalleryIcons.cupertino_pull_to_refresh, category: _kCupertinoComponents, routeName: CupertinoRefreshControlDemo.routeName, + documentationUrl: 'https://docs.flutter.io/flutter/cupertino/CupertinoSliverRefreshControl-class.html', buildRoute: (BuildContext context) => CupertinoRefreshControlDemo(), ), GalleryDemo( @@ -443,6 +481,7 @@ List _buildGalleryDemos() { icon: GalleryIcons.tabs, category: _kCupertinoComponents, routeName: CupertinoSegmentedControlDemo.routeName, + documentationUrl: 'https://docs.flutter.io/flutter/cupertino/CupertinoSegmentedControl-class.html', buildRoute: (BuildContext context) => CupertinoSegmentedControlDemo(), ), GalleryDemo( @@ -450,6 +489,7 @@ List _buildGalleryDemos() { icon: GalleryIcons.sliders, category: _kCupertinoComponents, routeName: CupertinoSliderDemo.routeName, + documentationUrl: 'https://docs.flutter.io/flutter/cupertino/CupertinoSlider-class.html', buildRoute: (BuildContext context) => CupertinoSliderDemo(), ), GalleryDemo( @@ -457,6 +497,7 @@ List _buildGalleryDemos() { icon: GalleryIcons.cupertino_switch, category: _kCupertinoComponents, routeName: CupertinoSwitchDemo.routeName, + documentationUrl: 'https://docs.flutter.io/flutter/cupertino/CupertinoSwitch-class.html', buildRoute: (BuildContext context) => CupertinoSwitchDemo(), ), @@ -510,3 +551,10 @@ final Map> kGalleryCategoryToDemos = return kAllGalleryDemos.where((GalleryDemo demo) => demo.category == category).toList(); }, ); + +final Map kDemoDocumentationUrl = + Map.fromIterable( + kAllGalleryDemos.where((GalleryDemo demo) => demo.documentationUrl != null), + key: (dynamic demo) => demo.routeName, + value: (dynamic demo) => demo.documentationUrl, + );