Unverified Commit 75b24070 authored by xster's avatar xster Committed by GitHub

Add API docs link to each gallery demo (#22379)

parent c60560fb
...@@ -3,18 +3,21 @@ ...@@ -3,18 +3,21 @@
// found in the LICENSE file. // found in the LICENSE file.
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import '../../gallery/demo.dart';
class CupertinoProgressIndicatorDemo extends StatelessWidget { class CupertinoProgressIndicatorDemo extends StatelessWidget {
static const String routeName = '/cupertino/progress_indicator'; static const String routeName = '/cupertino/progress_indicator';
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return CupertinoPageScaffold(
appBar: AppBar( navigationBar: CupertinoNavigationBar(
title: const Text('Cupertino Activity Indicator'), previousPageTitle: 'Cupertino',
middle: const Text('Cupertino Activity Indicator'),
trailing: CupertinoDemoDocumentationButton(routeName),
), ),
body: const Center( child: const Center(
child: CupertinoActivityIndicator(), child: CupertinoActivityIndicator(),
), ),
); );
......
...@@ -5,6 +5,8 @@ ...@@ -5,6 +5,8 @@
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../../gallery/demo.dart';
class CupertinoAlertDemo extends StatefulWidget { class CupertinoAlertDemo extends StatefulWidget {
static const String routeName = '/cupertino/alert'; static const String routeName = '/cupertino/alert';
...@@ -53,6 +55,7 @@ class _CupertinoAlertDemoState extends State<CupertinoAlertDemo> { ...@@ -53,6 +55,7 @@ class _CupertinoAlertDemoState extends State<CupertinoAlertDemo> {
key: _scaffoldKey, key: _scaffoldKey,
appBar: AppBar( appBar: AppBar(
title: const Text('Cupertino Alerts'), title: const Text('Cupertino Alerts'),
actions: <Widget>[MaterialDemoDocumentationButton(CupertinoAlertDemo.routeName)],
), ),
body: ListView( body: ListView(
padding: const EdgeInsets.symmetric(vertical: 24.0, horizontal: 72.0), padding: const EdgeInsets.symmetric(vertical: 24.0, horizontal: 72.0),
......
...@@ -5,6 +5,8 @@ ...@@ -5,6 +5,8 @@
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../../gallery/demo.dart';
class CupertinoButtonsDemo extends StatefulWidget { class CupertinoButtonsDemo extends StatefulWidget {
static const String routeName = '/cupertino/buttons'; static const String routeName = '/cupertino/buttons';
...@@ -20,6 +22,7 @@ class _CupertinoButtonDemoState extends State<CupertinoButtonsDemo> { ...@@ -20,6 +22,7 @@ class _CupertinoButtonDemoState extends State<CupertinoButtonsDemo> {
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
title: const Text('Cupertino Buttons'), title: const Text('Cupertino Buttons'),
actions: <Widget>[MaterialDemoDocumentationButton(CupertinoButtonsDemo.routeName)],
), ),
body: Column( body: Column(
children: <Widget> [ children: <Widget> [
......
...@@ -8,6 +8,8 @@ import 'dart:math' as math; ...@@ -8,6 +8,8 @@ import 'dart:math' as math;
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../../gallery/demo.dart';
const String _kGalleryAssetsPackage = 'flutter_gallery_assets'; const String _kGalleryAssetsPackage = 'flutter_gallery_assets';
const List<Color> coolColors = <Color>[ const List<Color> coolColors = <Color>[
...@@ -125,6 +127,15 @@ class ExitButton extends StatelessWidget { ...@@ -125,6 +127,15 @@ class ExitButton extends StatelessWidget {
} }
} }
final Widget trailingButtons = Row(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
CupertinoDemoDocumentationButton(CupertinoNavigationDemo.routeName),
const Padding(padding: EdgeInsets.only(left: 8.0)),
const ExitButton(),
],
);
class CupertinoDemoTab1 extends StatelessWidget { class CupertinoDemoTab1 extends StatelessWidget {
const CupertinoDemoTab1({this.colorItems, this.colorNameItems}); const CupertinoDemoTab1({this.colorItems, this.colorNameItems});
...@@ -136,8 +147,8 @@ class CupertinoDemoTab1 extends StatelessWidget { ...@@ -136,8 +147,8 @@ class CupertinoDemoTab1 extends StatelessWidget {
return CupertinoPageScaffold( return CupertinoPageScaffold(
child: CustomScrollView( child: CustomScrollView(
slivers: <Widget>[ slivers: <Widget>[
const CupertinoSliverNavigationBar( CupertinoSliverNavigationBar(
trailing: ExitButton(), trailing: trailingButtons,
), ),
SliverPadding( SliverPadding(
// Top media padding consumed by CupertinoSliverNavigationBar. // Top media padding consumed by CupertinoSliverNavigationBar.
...@@ -421,8 +432,8 @@ class CupertinoDemoTab2 extends StatelessWidget { ...@@ -421,8 +432,8 @@ class CupertinoDemoTab2 extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return CupertinoPageScaffold( return CupertinoPageScaffold(
navigationBar: const CupertinoNavigationBar( navigationBar: CupertinoNavigationBar(
trailing: ExitButton(), trailing: trailingButtons,
), ),
child: ListView( child: ListView(
children: <Widget>[ children: <Widget>[
...@@ -704,8 +715,8 @@ class CupertinoDemoTab3 extends StatelessWidget { ...@@ -704,8 +715,8 @@ class CupertinoDemoTab3 extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return CupertinoPageScaffold( return CupertinoPageScaffold(
navigationBar: const CupertinoNavigationBar( navigationBar: CupertinoNavigationBar(
trailing: ExitButton(), trailing: trailingButtons,
), ),
child: DecoratedBox( child: DecoratedBox(
decoration: const BoxDecoration(color: Color(0xFFEFEFF4)), decoration: const BoxDecoration(color: Color(0xFFEFEFF4)),
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../../gallery/demo.dart';
import 'cupertino_navigation_demo.dart' show coolColorNames; import 'cupertino_navigation_demo.dart' show coolColorNames;
const double _kPickerSheetHeight = 216.0; const double _kPickerSheetHeight = 216.0;
...@@ -132,6 +133,7 @@ class _CupertinoPickerDemoState extends State<CupertinoPickerDemo> { ...@@ -132,6 +133,7 @@ class _CupertinoPickerDemoState extends State<CupertinoPickerDemo> {
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
title: const Text('Cupertino Picker'), title: const Text('Cupertino Picker'),
actions: <Widget>[MaterialDemoDocumentationButton(CupertinoPickerDemo.routeName)],
), ),
body: DefaultTextStyle( body: DefaultTextStyle(
style: const TextStyle( style: const TextStyle(
......
...@@ -6,6 +6,8 @@ import 'dart:math' show Random; ...@@ -6,6 +6,8 @@ import 'dart:math' show Random;
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import '../../gallery/demo.dart';
class CupertinoRefreshControlDemo extends StatefulWidget { class CupertinoRefreshControlDemo extends StatefulWidget {
static const String routeName = '/cupertino/refresh'; static const String routeName = '/cupertino/refresh';
...@@ -48,9 +50,10 @@ class _CupertinoRefreshControlDemoState extends State<CupertinoRefreshControlDem ...@@ -48,9 +50,10 @@ class _CupertinoRefreshControlDemoState extends State<CupertinoRefreshControlDem
decoration: const BoxDecoration(color: Color(0xFFEFEFF4)), decoration: const BoxDecoration(color: Color(0xFFEFEFF4)),
child: CustomScrollView( child: CustomScrollView(
slivers: <Widget>[ slivers: <Widget>[
const CupertinoSliverNavigationBar( CupertinoSliverNavigationBar(
largeTitle: Text('Cupertino Refresh'), largeTitle: const Text('Cupertino Refresh'),
previousPageTitle: 'Cupertino', previousPageTitle: 'Cupertino',
trailing: CupertinoDemoDocumentationButton(CupertinoRefreshControlDemo.routeName),
), ),
CupertinoSliverRefreshControl( CupertinoSliverRefreshControl(
onRefresh: () { onRefresh: () {
......
...@@ -5,6 +5,8 @@ ...@@ -5,6 +5,8 @@
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../../gallery/demo.dart';
const Color _kKeyUmbraOpacity = Color(0x33000000); // alpha = 0.2 const Color _kKeyUmbraOpacity = Color(0x33000000); // alpha = 0.2
const Color _kKeyPenumbraOpacity = Color(0x24000000); // alpha = 0.14 const Color _kKeyPenumbraOpacity = Color(0x24000000); // alpha = 0.14
const Color _kAmbientShadowOpacity = Color(0x1F000000); // alpha = 0.12 const Color _kAmbientShadowOpacity = Color(0x1F000000); // alpha = 0.12
...@@ -51,6 +53,7 @@ class _CupertinoSegmentedControlDemoState extends State<CupertinoSegmentedContro ...@@ -51,6 +53,7 @@ class _CupertinoSegmentedControlDemoState extends State<CupertinoSegmentedContro
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
title: const Text('Segmented Control'), title: const Text('Segmented Control'),
actions: <Widget>[MaterialDemoDocumentationButton(CupertinoSegmentedControlDemo.routeName)],
), ),
body: Column( body: Column(
children: <Widget>[ children: <Widget>[
......
...@@ -5,6 +5,8 @@ ...@@ -5,6 +5,8 @@
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../../gallery/demo.dart';
class CupertinoSliderDemo extends StatefulWidget { class CupertinoSliderDemo extends StatefulWidget {
static const String routeName = '/cupertino/slider'; static const String routeName = '/cupertino/slider';
...@@ -21,6 +23,7 @@ class _CupertinoSliderDemoState extends State<CupertinoSliderDemo> { ...@@ -21,6 +23,7 @@ class _CupertinoSliderDemoState extends State<CupertinoSliderDemo> {
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
title: const Text('Cupertino Sliders'), title: const Text('Cupertino Sliders'),
actions: <Widget>[MaterialDemoDocumentationButton(CupertinoSliderDemo.routeName)],
), ),
body: Center( body: Center(
child: Column( child: Column(
......
...@@ -5,6 +5,8 @@ ...@@ -5,6 +5,8 @@
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../../gallery/demo.dart';
class CupertinoSwitchDemo extends StatefulWidget { class CupertinoSwitchDemo extends StatefulWidget {
static const String routeName = '/cupertino/switch'; static const String routeName = '/cupertino/switch';
...@@ -21,6 +23,7 @@ class _CupertinoSwitchDemoState extends State<CupertinoSwitchDemo> { ...@@ -21,6 +23,7 @@ class _CupertinoSwitchDemoState extends State<CupertinoSwitchDemo> {
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
title: const Text('Cupertino Switch'), title: const Text('Cupertino Switch'),
actions: <Widget>[MaterialDemoDocumentationButton(CupertinoSwitchDemo.routeName)],
), ),
body: Center( body: Center(
child: Column( child: Column(
......
...@@ -4,6 +4,8 @@ ...@@ -4,6 +4,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../../gallery/demo.dart';
class BottomAppBarDemo extends StatefulWidget { class BottomAppBarDemo extends StatefulWidget {
static const String routeName = '/material/bottom_app_bar'; static const String routeName = '/material/bottom_app_bar';
...@@ -143,6 +145,7 @@ class _BottomAppBarDemoState extends State<BottomAppBarDemo> { ...@@ -143,6 +145,7 @@ class _BottomAppBarDemoState extends State<BottomAppBarDemo> {
title: const Text('Bottom app bar'), title: const Text('Bottom app bar'),
elevation: 0.0, elevation: 0.0,
actions: <Widget>[ actions: <Widget>[
MaterialDemoDocumentationButton(BottomAppBarDemo.routeName),
IconButton( IconButton(
icon: const Icon(Icons.sentiment_very_satisfied), icon: const Icon(Icons.sentiment_very_satisfied),
onPressed: () { onPressed: () {
......
...@@ -4,6 +4,8 @@ ...@@ -4,6 +4,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../../gallery/demo.dart';
class NavigationIconView { class NavigationIconView {
NavigationIconView({ NavigationIconView({
Widget icon, Widget icon,
...@@ -209,6 +211,7 @@ class _BottomNavigationDemoState extends State<BottomNavigationDemo> ...@@ -209,6 +211,7 @@ class _BottomNavigationDemoState extends State<BottomNavigationDemo>
appBar: AppBar( appBar: AppBar(
title: const Text('Bottom navigation'), title: const Text('Bottom navigation'),
actions: <Widget>[ actions: <Widget>[
MaterialDemoDocumentationButton(BottomNavigationDemo.routeName),
PopupMenuButton<BottomNavigationBarType>( PopupMenuButton<BottomNavigationBarType>(
onSelected: (BottomNavigationBarType value) { onSelected: (BottomNavigationBarType value) {
setState(() { setState(() {
......
...@@ -70,6 +70,7 @@ class _ButtonsDemoState extends State<ButtonsDemo> { ...@@ -70,6 +70,7 @@ class _ButtonsDemoState extends State<ButtonsDemo> {
child: buildRaisedButton(), child: buildRaisedButton(),
), ),
exampleCodeTag: _raisedCode, exampleCodeTag: _raisedCode,
documentationUrl: 'https://docs.flutter.io/flutter/material/RaisedButton-class.html',
), ),
ComponentDemoTabData( ComponentDemoTabData(
tabName: 'FLAT', tabName: 'FLAT',
...@@ -79,6 +80,7 @@ class _ButtonsDemoState extends State<ButtonsDemo> { ...@@ -79,6 +80,7 @@ class _ButtonsDemoState extends State<ButtonsDemo> {
child: buildFlatButton(), child: buildFlatButton(),
), ),
exampleCodeTag: _flatCode, exampleCodeTag: _flatCode,
documentationUrl: 'https://docs.flutter.io/flutter/material/FlatButton-class.html',
), ),
ComponentDemoTabData( ComponentDemoTabData(
tabName: 'OUTLINE', tabName: 'OUTLINE',
...@@ -88,24 +90,28 @@ class _ButtonsDemoState extends State<ButtonsDemo> { ...@@ -88,24 +90,28 @@ class _ButtonsDemoState extends State<ButtonsDemo> {
child: buildOutlineButton(), child: buildOutlineButton(),
), ),
exampleCodeTag: _outlineCode, exampleCodeTag: _outlineCode,
documentationUrl: 'https://docs.flutter.io/flutter/material/OutlineButton-class.html',
), ),
ComponentDemoTabData( ComponentDemoTabData(
tabName: 'DROPDOWN', tabName: 'DROPDOWN',
description: _dropdownText, description: _dropdownText,
demoWidget: buildDropdownButton(), demoWidget: buildDropdownButton(),
exampleCodeTag: _dropdownCode, exampleCodeTag: _dropdownCode,
documentationUrl: 'https://docs.flutter.io/flutter/material/DropdownButton-class.html',
), ),
ComponentDemoTabData( ComponentDemoTabData(
tabName: 'ICON', tabName: 'ICON',
description: _iconText, description: _iconText,
demoWidget: buildIconButton(), demoWidget: buildIconButton(),
exampleCodeTag: _iconCode, exampleCodeTag: _iconCode,
documentationUrl: 'https://docs.flutter.io/flutter/material/IconButton-class.html',
), ),
ComponentDemoTabData( ComponentDemoTabData(
tabName: 'ACTION', tabName: 'ACTION',
description: _actionText, description: _actionText,
demoWidget: buildActionButton(), demoWidget: buildActionButton(),
exampleCodeTag: _actionCode, exampleCodeTag: _actionCode,
documentationUrl: 'https://docs.flutter.io/flutter/material/FloatingActionButton-class.html',
), ),
]; ];
......
...@@ -5,6 +5,8 @@ ...@@ -5,6 +5,8 @@
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../../gallery/demo.dart';
const String _kGalleryAssetsPackage = 'flutter_gallery_assets'; const String _kGalleryAssetsPackage = 'flutter_gallery_assets';
class TravelDestination { class TravelDestination {
...@@ -168,6 +170,7 @@ class _CardsDemoState extends State<CardsDemo> { ...@@ -168,6 +170,7 @@ class _CardsDemoState extends State<CardsDemo> {
appBar: AppBar( appBar: AppBar(
title: const Text('Travel stream'), title: const Text('Travel stream'),
actions: <Widget>[ actions: <Widget>[
MaterialDemoDocumentationButton(CardsDemo.routeName),
IconButton( IconButton(
icon: const Icon(Icons.sentiment_very_satisfied), icon: const Icon(Icons.sentiment_very_satisfied),
onPressed: () { onPressed: () {
......
...@@ -4,6 +4,8 @@ ...@@ -4,6 +4,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../../gallery/demo.dart';
const List<String> _defaultMaterials = <String>[ const List<String> _defaultMaterials = <String>[
'poker', 'poker',
'tortilla', 'tortilla',
...@@ -303,6 +305,7 @@ class _ChipDemoState extends State<ChipDemo> { ...@@ -303,6 +305,7 @@ class _ChipDemoState extends State<ChipDemo> {
appBar: AppBar( appBar: AppBar(
title: const Text('Chips'), title: const Text('Chips'),
actions: <Widget>[ actions: <Widget>[
MaterialDemoDocumentationButton(ChipDemo.routeName),
IconButton( IconButton(
onPressed: () { onPressed: () {
setState(() { setState(() {
......
...@@ -5,6 +5,8 @@ ...@@ -5,6 +5,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart'; import 'package:flutter/rendering.dart';
import '../../gallery/demo.dart';
class Dessert { class Dessert {
Dessert(this.name, this.calories, this.fat, this.carbs, this.protein, this.sodium, this.calcium, this.iron); Dessert(this.name, this.calories, this.fat, this.carbs, this.protein, this.sodium, this.calcium, this.iron);
final String name; final String name;
...@@ -164,7 +166,12 @@ class _DataTableDemoState extends State<DataTableDemo> { ...@@ -164,7 +166,12 @@ class _DataTableDemoState extends State<DataTableDemo> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
appBar: AppBar(title: const Text('Data tables')), appBar: AppBar(
title: const Text('Data tables'),
actions: <Widget>[
MaterialDemoDocumentationButton(DataTableDemo.routeName),
],
),
body: ListView( body: ListView(
padding: const EdgeInsets.all(20.0), padding: const EdgeInsets.all(20.0),
children: <Widget>[ children: <Widget>[
......
...@@ -7,6 +7,8 @@ import 'dart:async'; ...@@ -7,6 +7,8 @@ import 'dart:async';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
import '../../gallery/demo.dart';
class _InputDropdown extends StatelessWidget { class _InputDropdown extends StatelessWidget {
const _InputDropdown({ const _InputDropdown({
Key key, Key key,
...@@ -129,7 +131,10 @@ class _DateAndTimePickerDemoState extends State<DateAndTimePickerDemo> { ...@@ -129,7 +131,10 @@ class _DateAndTimePickerDemoState extends State<DateAndTimePickerDemo> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
appBar: AppBar(title: const Text('Date and time pickers')), appBar: AppBar(
title: const Text('Date and time pickers'),
actions: <Widget>[MaterialDemoDocumentationButton(DateAndTimePickerDemo.routeName)],
),
body: DropdownButtonHideUnderline( body: DropdownButtonHideUnderline(
child: SafeArea( child: SafeArea(
top: false, top: false,
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../../gallery/demo.dart';
import 'full_screen_dialog_demo.dart'; import 'full_screen_dialog_demo.dart';
enum DialogDemoAction { enum DialogDemoAction {
...@@ -87,7 +88,8 @@ class DialogDemoState extends State<DialogDemo> { ...@@ -87,7 +88,8 @@ class DialogDemoState extends State<DialogDemo> {
return Scaffold( return Scaffold(
key: _scaffoldKey, key: _scaffoldKey,
appBar: AppBar( appBar: AppBar(
title: const Text('Dialogs') title: const Text('Dialogs'),
actions: <Widget>[MaterialDemoDocumentationButton(DialogDemo.routeName)],
), ),
body: ListView( body: ListView(
padding: const EdgeInsets.symmetric(vertical: 24.0, horizontal: 72.0), padding: const EdgeInsets.symmetric(vertical: 24.0, horizontal: 72.0),
......
...@@ -4,6 +4,8 @@ ...@@ -4,6 +4,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../../gallery/demo.dart';
const String _kAsset0 = 'people/square/trevor.png'; const String _kAsset0 = 'people/square/trevor.png';
const String _kAsset1 = 'people/square/stella.png'; const String _kAsset1 = 'people/square/stella.png';
const String _kAsset2 = 'people/square/sandra.png'; const String _kAsset2 = 'people/square/sandra.png';
...@@ -88,6 +90,7 @@ class _DrawerDemoState extends State<DrawerDemo> with TickerProviderStateMixin { ...@@ -88,6 +90,7 @@ class _DrawerDemoState extends State<DrawerDemo> with TickerProviderStateMixin {
}, },
), ),
title: const Text('Navigation drawer'), title: const Text('Navigation drawer'),
actions: <Widget>[MaterialDemoDocumentationButton(DrawerDemo.routeName)],
), ),
drawer: Drawer( drawer: Drawer(
child: Column( child: Column(
......
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../../gallery/demo.dart';
class ElevationDemo extends StatefulWidget { class ElevationDemo extends StatefulWidget {
static const String routeName = '/material/elevation'; static const String routeName = '/material/elevation';
...@@ -46,6 +48,7 @@ class _ElevationDemoState extends State<ElevationDemo> { ...@@ -46,6 +48,7 @@ class _ElevationDemoState extends State<ElevationDemo> {
appBar: AppBar( appBar: AppBar(
title: const Text('Elevation'), title: const Text('Elevation'),
actions: <Widget>[ actions: <Widget>[
MaterialDemoDocumentationButton(ElevationDemo.routeName),
IconButton( IconButton(
icon: const Icon(Icons.sentiment_very_satisfied), icon: const Icon(Icons.sentiment_very_satisfied),
onPressed: () { onPressed: () {
......
...@@ -4,6 +4,8 @@ ...@@ -4,6 +4,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../../gallery/demo.dart';
enum _Location { enum _Location {
Barbados, Barbados,
Bahamas, Bahamas,
...@@ -336,7 +338,12 @@ class _ExpansionPanelsDemoState extends State<ExpansionPanelsDemo> { ...@@ -336,7 +338,12 @@ class _ExpansionPanelsDemoState extends State<ExpansionPanelsDemo> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
appBar: AppBar(title: const Text('Expansion panels')), appBar: AppBar(
title: const Text('Expansion panels'),
actions: <Widget>[
MaterialDemoDocumentationButton(ExpansionPanelsDemo.routeName),
],
),
body: SingleChildScrollView( body: SingleChildScrollView(
child: SafeArea( child: SafeArea(
top: false, top: false,
......
...@@ -4,6 +4,8 @@ ...@@ -4,6 +4,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../../gallery/demo.dart';
enum GridDemoTileStyle { enum GridDemoTileStyle {
imageOnly, imageOnly,
oneLine, oneLine,
...@@ -340,6 +342,7 @@ class GridListDemoState extends State<GridListDemo> { ...@@ -340,6 +342,7 @@ class GridListDemoState extends State<GridListDemo> {
appBar: AppBar( appBar: AppBar(
title: const Text('Grid list'), title: const Text('Grid list'),
actions: <Widget>[ actions: <Widget>[
MaterialDemoDocumentationButton(GridListDemo.routeName),
PopupMenuButton<GridDemoTileStyle>( PopupMenuButton<GridDemoTileStyle>(
onSelected: changeTileStyle, onSelected: changeTileStyle,
itemBuilder: (BuildContext context) => <PopupMenuItem<GridDemoTileStyle>>[ itemBuilder: (BuildContext context) => <PopupMenuItem<GridDemoTileStyle>>[
......
...@@ -4,6 +4,8 @@ ...@@ -4,6 +4,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../../gallery/demo.dart';
class IconsDemo extends StatefulWidget { class IconsDemo extends StatefulWidget {
static const String routeName = '/material/icons'; static const String routeName = '/material/icons';
...@@ -48,7 +50,8 @@ class IconsDemoState extends State<IconsDemo> { ...@@ -48,7 +50,8 @@ class IconsDemoState extends State<IconsDemo> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
title: const Text('Icons') title: const Text('Icons'),
actions: <Widget>[MaterialDemoDocumentationButton(IconsDemo.routeName)],
), ),
body: IconTheme( body: IconTheme(
data: IconThemeData(color: iconColor), data: IconThemeData(color: iconColor),
......
...@@ -7,6 +7,8 @@ import 'package:collection/collection.dart' show lowerBound; ...@@ -7,6 +7,8 @@ import 'package:collection/collection.dart' show lowerBound;
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/semantics.dart'; import 'package:flutter/semantics.dart';
import '../../gallery/demo.dart';
enum LeaveBehindDemoAction { enum LeaveBehindDemoAction {
reset, reset,
horizontalSwipe, horizontalSwipe,
...@@ -140,6 +142,7 @@ class LeaveBehindDemoState extends State<LeaveBehindDemo> { ...@@ -140,6 +142,7 @@ class LeaveBehindDemoState extends State<LeaveBehindDemo> {
appBar: AppBar( appBar: AppBar(
title: const Text('Swipe to dismiss'), title: const Text('Swipe to dismiss'),
actions: <Widget>[ actions: <Widget>[
MaterialDemoDocumentationButton(LeaveBehindDemo.routeName),
PopupMenuButton<LeaveBehindDemoAction>( PopupMenuButton<LeaveBehindDemoAction>(
onSelected: handleDemoAction, onSelected: handleDemoAction,
itemBuilder: (BuildContext context) => <PopupMenuEntry<LeaveBehindDemoAction>>[ itemBuilder: (BuildContext context) => <PopupMenuEntry<LeaveBehindDemoAction>>[
......
...@@ -4,6 +4,8 @@ ...@@ -4,6 +4,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../../gallery/demo.dart';
enum _MaterialListType { enum _MaterialListType {
/// A list tile that contains a single line of text. /// A list tile that contains a single line of text.
oneLine, oneLine,
...@@ -216,6 +218,7 @@ class _ListDemoState extends State<ListDemo> { ...@@ -216,6 +218,7 @@ class _ListDemoState extends State<ListDemo> {
appBar: AppBar( appBar: AppBar(
title: Text('Scrolling list\n$itemTypeText$layoutText'), title: Text('Scrolling list\n$itemTypeText$layoutText'),
actions: <Widget>[ actions: <Widget>[
MaterialDemoDocumentationButton(ListDemo.routeName),
IconButton( IconButton(
icon: const Icon(Icons.sort_by_alpha), icon: const Icon(Icons.sort_by_alpha),
tooltip: 'Sort', tooltip: 'Sort',
......
...@@ -4,6 +4,8 @@ ...@@ -4,6 +4,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../../gallery/demo.dart';
class MenuDemo extends StatefulWidget { class MenuDemo extends StatefulWidget {
const MenuDemo({ Key key }) : super(key: key); const MenuDemo({ Key key }) : super(key: key);
...@@ -64,6 +66,7 @@ class MenuDemoState extends State<MenuDemo> { ...@@ -64,6 +66,7 @@ class MenuDemoState extends State<MenuDemo> {
appBar: AppBar( appBar: AppBar(
title: const Text('Menus'), title: const Text('Menus'),
actions: <Widget>[ actions: <Widget>[
MaterialDemoDocumentationButton(MenuDemo.routeName),
PopupMenuButton<String>( PopupMenuButton<String>(
onSelected: showMenuSelection, onSelected: showMenuSelection,
itemBuilder: (BuildContext context) => <PopupMenuItem<String>>[ itemBuilder: (BuildContext context) => <PopupMenuItem<String>>[
......
...@@ -4,13 +4,18 @@ ...@@ -4,13 +4,18 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../../gallery/demo.dart';
class ModalBottomSheetDemo extends StatelessWidget { class ModalBottomSheetDemo extends StatelessWidget {
static const String routeName = '/material/modal-bottom-sheet'; static const String routeName = '/material/modal-bottom-sheet';
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
appBar: AppBar(title: const Text('Modal bottom sheet')), appBar: AppBar(
title: const Text('Modal bottom sheet'),
actions: <Widget>[MaterialDemoDocumentationButton(routeName)],
),
body: Center( body: Center(
child: RaisedButton( child: RaisedButton(
child: const Text('SHOW BOTTOM SHEET'), child: const Text('SHOW BOTTOM SHEET'),
......
...@@ -6,6 +6,8 @@ import 'dart:async'; ...@@ -6,6 +6,8 @@ import 'dart:async';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../../gallery/demo.dart';
enum IndicatorType { overscroll, refresh } enum IndicatorType { overscroll, refresh }
class OverscrollDemo extends StatefulWidget { class OverscrollDemo extends StatefulWidget {
...@@ -47,6 +49,7 @@ class OverscrollDemoState extends State<OverscrollDemo> { ...@@ -47,6 +49,7 @@ class OverscrollDemoState extends State<OverscrollDemo> {
appBar: AppBar( appBar: AppBar(
title: const Text('Pull to refresh'), title: const Text('Pull to refresh'),
actions: <Widget>[ actions: <Widget>[
MaterialDemoDocumentationButton(OverscrollDemo.routeName),
IconButton( IconButton(
icon: const Icon(Icons.refresh), icon: const Icon(Icons.refresh),
tooltip: 'Refresh', tooltip: 'Refresh',
......
...@@ -4,6 +4,8 @@ ...@@ -4,6 +4,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../../gallery/demo.dart';
class _PageSelector extends StatelessWidget { class _PageSelector extends StatelessWidget {
const _PageSelector({ this.icons }); const _PageSelector({ this.icons });
...@@ -85,7 +87,10 @@ class PageSelectorDemo extends StatelessWidget { ...@@ -85,7 +87,10 @@ class PageSelectorDemo extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
appBar: AppBar(title: const Text('Page selector')), appBar: AppBar(
title: const Text('Page selector'),
actions: <Widget>[MaterialDemoDocumentationButton(routeName)],
),
body: DefaultTabController( body: DefaultTabController(
length: icons.length, length: icons.length,
child: _PageSelector(icons: icons), child: _PageSelector(icons: icons),
......
...@@ -4,6 +4,8 @@ ...@@ -4,6 +4,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../../gallery/demo.dart';
class PersistentBottomSheetDemo extends StatefulWidget { class PersistentBottomSheetDemo extends StatefulWidget {
static const String routeName = '/material/persistent-bottom-sheet'; static const String routeName = '/material/persistent-bottom-sheet';
...@@ -76,7 +78,12 @@ class _PersistentBottomSheetDemoState extends State<PersistentBottomSheetDemo> { ...@@ -76,7 +78,12 @@ class _PersistentBottomSheetDemoState extends State<PersistentBottomSheetDemo> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
key: _scaffoldKey, key: _scaffoldKey,
appBar: AppBar(title: const Text('Persistent bottom sheet')), appBar: AppBar(
title: const Text('Persistent bottom sheet'),
actions: <Widget>[
MaterialDemoDocumentationButton(PersistentBottomSheetDemo.routeName),
],
),
floatingActionButton: FloatingActionButton( floatingActionButton: FloatingActionButton(
onPressed: _showMessage, onPressed: _showMessage,
backgroundColor: Colors.redAccent, backgroundColor: Colors.redAccent,
......
...@@ -4,6 +4,8 @@ ...@@ -4,6 +4,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../../gallery/demo.dart';
class ProgressIndicatorDemo extends StatefulWidget { class ProgressIndicatorDemo extends StatefulWidget {
static const String routeName = '/material/progress-indicator'; static const String routeName = '/material/progress-indicator';
...@@ -100,7 +102,10 @@ class _ProgressIndicatorDemoState extends State<ProgressIndicatorDemo> with Sing ...@@ -100,7 +102,10 @@ class _ProgressIndicatorDemoState extends State<ProgressIndicatorDemo> with Sing
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
appBar: AppBar(title: const Text('Progress indicators')), appBar: AppBar(
title: const Text('Progress indicators'),
actions: <Widget>[MaterialDemoDocumentationButton(ProgressIndicatorDemo.routeName)],
),
body: Center( body: Center(
child: SingleChildScrollView( child: SingleChildScrollView(
child: DefaultTextStyle( child: DefaultTextStyle(
......
...@@ -6,6 +6,8 @@ import 'package:flutter/foundation.dart'; ...@@ -6,6 +6,8 @@ import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart'; import 'package:flutter/rendering.dart';
import '../../gallery/demo.dart';
enum _ReorderableListType { enum _ReorderableListType {
/// A list tile that contains a [CircleAvatar]. /// A list tile that contains a [CircleAvatar].
horizontalAvatar, horizontalAvatar,
...@@ -157,6 +159,7 @@ class _ListDemoState extends State<ReorderableListDemo> { ...@@ -157,6 +159,7 @@ class _ListDemoState extends State<ReorderableListDemo> {
appBar: AppBar( appBar: AppBar(
title: const Text('Reorderable list'), title: const Text('Reorderable list'),
actions: <Widget>[ actions: <Widget>[
MaterialDemoDocumentationButton(ReorderableListDemo.routeName),
IconButton( IconButton(
icon: const Icon(Icons.sort_by_alpha), icon: const Icon(Icons.sort_by_alpha),
tooltip: 'Sort', tooltip: 'Sort',
......
...@@ -4,6 +4,8 @@ ...@@ -4,6 +4,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../../gallery/demo.dart';
enum TabsDemoStyle { enum TabsDemoStyle {
iconsAndText, iconsAndText,
iconsOnly, iconsOnly,
...@@ -125,6 +127,7 @@ class ScrollableTabsDemoState extends State<ScrollableTabsDemo> with SingleTicke ...@@ -125,6 +127,7 @@ class ScrollableTabsDemoState extends State<ScrollableTabsDemo> with SingleTicke
appBar: AppBar( appBar: AppBar(
title: const Text('Scrollable tabs'), title: const Text('Scrollable tabs'),
actions: <Widget>[ actions: <Widget>[
MaterialDemoDocumentationButton(ScrollableTabsDemo.routeName),
IconButton( IconButton(
icon: const Icon(Icons.sentiment_very_satisfied), icon: const Icon(Icons.sentiment_very_satisfied),
onPressed: () { onPressed: () {
......
...@@ -4,6 +4,8 @@ ...@@ -4,6 +4,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../../gallery/demo.dart';
class SearchDemo extends StatefulWidget { class SearchDemo extends StatefulWidget {
static const String routeName = '/material/search'; static const String routeName = '/material/search';
...@@ -50,6 +52,7 @@ class _SearchDemoState extends State<SearchDemo> { ...@@ -50,6 +52,7 @@ class _SearchDemoState extends State<SearchDemo> {
} }
}, },
), ),
MaterialDemoDocumentationButton(SearchDemo.routeName),
IconButton( IconButton(
tooltip: 'More (not implemented)', tooltip: 'More (not implemented)',
icon: Icon( icon: Icon(
......
...@@ -42,19 +42,22 @@ class _SelectionControlsDemoState extends State<SelectionControlsDemo> { ...@@ -42,19 +42,22 @@ class _SelectionControlsDemoState extends State<SelectionControlsDemo> {
tabName: 'CHECKBOX', tabName: 'CHECKBOX',
description: _checkboxText, description: _checkboxText,
demoWidget: buildCheckbox(), demoWidget: buildCheckbox(),
exampleCodeTag: _checkboxCode exampleCodeTag: _checkboxCode,
documentationUrl: 'https://docs.flutter.io/flutter/material/Checkbox-class.html',
), ),
ComponentDemoTabData( ComponentDemoTabData(
tabName: 'RADIO', tabName: 'RADIO',
description: _radioText, description: _radioText,
demoWidget: buildRadio(), demoWidget: buildRadio(),
exampleCodeTag: _radioCode exampleCodeTag: _radioCode,
documentationUrl: 'https://docs.flutter.io/flutter/material/Radio-class.html',
), ),
ComponentDemoTabData( ComponentDemoTabData(
tabName: 'SWITCH', tabName: 'SWITCH',
description: _switchText, description: _switchText,
demoWidget: buildSwitch(), demoWidget: buildSwitch(),
exampleCodeTag: _switchCode exampleCodeTag: _switchCode,
documentationUrl: 'https://docs.flutter.io/flutter/material/Switch-class.html',
) )
]; ];
......
...@@ -6,6 +6,8 @@ import 'dart:math' as math; ...@@ -6,6 +6,8 @@ import 'dart:math' as math;
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../../gallery/demo.dart';
class SliderDemo extends StatefulWidget { class SliderDemo extends StatefulWidget {
static const String routeName = '/material/slider'; static const String routeName = '/material/slider';
...@@ -132,7 +134,10 @@ class _SliderDemoState extends State<SliderDemo> { ...@@ -132,7 +134,10 @@ class _SliderDemoState extends State<SliderDemo> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
final ThemeData theme = Theme.of(context); final ThemeData theme = Theme.of(context);
return Scaffold( return Scaffold(
appBar: AppBar(title: const Text('Sliders')), appBar: AppBar(
title: const Text('Sliders'),
actions: <Widget>[MaterialDemoDocumentationButton(SliderDemo.routeName)],
),
body: Padding( body: Padding(
padding: const EdgeInsets.symmetric(horizontal: 40.0), padding: const EdgeInsets.symmetric(horizontal: 40.0),
child: Column( child: Column(
......
...@@ -4,6 +4,8 @@ ...@@ -4,6 +4,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../../gallery/demo.dart';
const String _text1 = const String _text1 =
'Snackbars provide lightweight feedback about an operation by ' 'Snackbars provide lightweight feedback about an operation by '
'showing a brief message at the bottom of the screen. Snackbars ' 'showing a brief message at the bottom of the screen. Snackbars '
...@@ -73,7 +75,8 @@ class _SnackBarDemoState extends State<SnackBarDemo> { ...@@ -73,7 +75,8 @@ class _SnackBarDemoState extends State<SnackBarDemo> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
title: const Text('Snackbar') title: const Text('Snackbar'),
actions: <Widget>[MaterialDemoDocumentationButton(SnackBarDemo.routeName)],
), ),
body: Builder( body: Builder(
// Create an inner BuildContext so that the snackBar onPressed methods // Create an inner BuildContext so that the snackBar onPressed methods
......
...@@ -4,6 +4,8 @@ ...@@ -4,6 +4,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../../gallery/demo.dart';
// Each TabBarView contains a _Page and for each _Page there is a list // Each TabBarView contains a _Page and for each _Page there is a list
// of _CardData objects. Each _CardData object is displayed by a _CardItem. // of _CardData objects. Each _CardData object is displayed by a _CardItem.
...@@ -150,6 +152,7 @@ class TabsDemo extends StatelessWidget { ...@@ -150,6 +152,7 @@ class TabsDemo extends StatelessWidget {
handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context), handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context),
child: SliverAppBar( child: SliverAppBar(
title: const Text('Tabs and scrolling'), title: const Text('Tabs and scrolling'),
actions: <Widget>[MaterialDemoDocumentationButton(routeName)],
pinned: true, pinned: true,
expandedHeight: 150.0, expandedHeight: 150.0,
forceElevated: innerBoxIsScrolled, forceElevated: innerBoxIsScrolled,
......
...@@ -4,6 +4,8 @@ ...@@ -4,6 +4,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../../gallery/demo.dart';
const String _explanatoryText = const String _explanatoryText =
"When the Scaffold's floating action button changes, the new button fades and " "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 ' 'turns into view. In this demo, changing tabs can cause the app to be rebuilt '
...@@ -137,6 +139,7 @@ class _TabsFabDemoState extends State<TabsFabDemo> with SingleTickerProviderStat ...@@ -137,6 +139,7 @@ class _TabsFabDemoState extends State<TabsFabDemo> with SingleTickerProviderStat
tabs: _allPages.map((_Page page) => Tab(text: page.label.toUpperCase())).toList(), tabs: _allPages.map((_Page page) => Tab(text: page.label.toUpperCase())).toList(),
), ),
actions: <Widget>[ actions: <Widget>[
MaterialDemoDocumentationButton(TabsFabDemo.routeName),
IconButton( IconButton(
icon: const Icon(Icons.sentiment_very_satisfied), icon: const Icon(Icons.sentiment_very_satisfied),
onPressed: () { onPressed: () {
......
...@@ -7,6 +7,8 @@ import 'dart:async'; ...@@ -7,6 +7,8 @@ import 'dart:async';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import '../../gallery/demo.dart';
class TextFormFieldDemo extends StatefulWidget { class TextFormFieldDemo extends StatefulWidget {
const TextFormFieldDemo({ Key key }) : super(key: key); const TextFormFieldDemo({ Key key }) : super(key: key);
...@@ -165,6 +167,7 @@ class TextFormFieldDemoState extends State<TextFormFieldDemo> { ...@@ -165,6 +167,7 @@ class TextFormFieldDemoState extends State<TextFormFieldDemo> {
key: _scaffoldKey, key: _scaffoldKey,
appBar: AppBar( appBar: AppBar(
title: const Text('Text fields'), title: const Text('Text fields'),
actions: <Widget>[MaterialDemoDocumentationButton(TextFormFieldDemo.routeName)],
), ),
body: SafeArea( body: SafeArea(
top: false, top: false,
......
...@@ -4,6 +4,8 @@ ...@@ -4,6 +4,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../../gallery/demo.dart';
const String _introText = const String _introText =
'Tooltips are short identifying messages that briefly appear in response to ' 'Tooltips are short identifying messages that briefly appear in response to '
'a long press. Tooltip messages are also used by services that make Flutter ' 'a long press. Tooltip messages are also used by services that make Flutter '
...@@ -18,7 +20,8 @@ class TooltipDemo extends StatelessWidget { ...@@ -18,7 +20,8 @@ class TooltipDemo extends StatelessWidget {
final ThemeData theme = Theme.of(context); final ThemeData theme = Theme.of(context);
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
title: const Text('Tooltips') title: const Text('Tooltips'),
actions: <Widget>[MaterialDemoDocumentationButton(routeName)],
), ),
body: Builder( body: Builder(
builder: (BuildContext context) { builder: (BuildContext context) {
......
...@@ -4,13 +4,18 @@ ...@@ -4,13 +4,18 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../../gallery/demo.dart';
class TwoLevelListDemo extends StatelessWidget { class TwoLevelListDemo extends StatelessWidget {
static const String routeName = '/material/two-level-list'; static const String routeName = '/material/two-level-list';
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
appBar: AppBar(title: const Text('Expand/collapse list control')), appBar: AppBar(
title: const Text('Expand/collapse list control'),
actions: <Widget>[MaterialDemoDocumentationButton(routeName)],
),
body: ListView( body: ListView(
children: <Widget>[ children: <Widget>[
const ListTile(title: Text('Top')), const ListTile(title: Text('Top')),
......
...@@ -2,8 +2,11 @@ ...@@ -2,8 +2,11 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:url_launcher/url_launcher.dart';
import 'demos.dart';
import 'example_code_parser.dart'; import 'example_code_parser.dart';
import 'syntax_highlighter.dart'; import 'syntax_highlighter.dart';
...@@ -12,24 +15,28 @@ class ComponentDemoTabData { ...@@ -12,24 +15,28 @@ class ComponentDemoTabData {
this.demoWidget, this.demoWidget,
this.exampleCodeTag, this.exampleCodeTag,
this.description, this.description,
this.tabName this.tabName,
this.documentationUrl,
}); });
final Widget demoWidget; final Widget demoWidget;
final String exampleCodeTag; final String exampleCodeTag;
final String description; final String description;
final String tabName; final String tabName;
final String documentationUrl;
@override @override
bool operator==(Object other) { bool operator==(Object other) {
if (other.runtimeType != runtimeType) if (other.runtimeType != runtimeType)
return false; return false;
final ComponentDemoTabData typedOther = other; final ComponentDemoTabData typedOther = other;
return typedOther.tabName == tabName && typedOther.description == description; return typedOther.tabName == tabName
&& typedOther.description == description
&& typedOther.documentationUrl == documentationUrl;
} }
@override @override
int get hashCode => hashValues(tabName.hashCode, description.hashCode); int get hashCode => hashValues(tabName, description, documentationUrl);
} }
class TabbedComponentDemoScaffold extends StatelessWidget { class TabbedComponentDemoScaffold extends StatelessWidget {
...@@ -52,6 +59,13 @@ 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 @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return DefaultTabController( return DefaultTabController(
...@@ -61,14 +75,20 @@ class TabbedComponentDemoScaffold extends StatelessWidget { ...@@ -61,14 +75,20 @@ class TabbedComponentDemoScaffold extends StatelessWidget {
title: Text(title), title: Text(title),
actions: (actions ?? <Widget>[])..addAll( actions: (actions ?? <Widget>[])..addAll(
<Widget>[ <Widget>[
Builder(
builder: (BuildContext context) {
return IconButton(
icon: const Icon(Icons.library_books),
onPressed: () => _showApiDocumentation(context),
);
},
),
Builder( Builder(
builder: (BuildContext context) { builder: (BuildContext context) {
return IconButton( return IconButton(
icon: const Icon(Icons.code), icon: const Icon(Icons.code),
tooltip: 'Show example code', tooltip: 'Show example code',
onPressed: () { onPressed: () => _showExampleCode(context),
_showExampleCode(context);
},
); );
}, },
) )
...@@ -170,3 +190,44 @@ class FullScreenCodeDialogState extends State<FullScreenCodeDialog> { ...@@ -170,3 +190,44 @@ class FullScreenCodeDialogState extends State<FullScreenCodeDialog> {
); );
} }
} }
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)
);
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment