demos.dart 21.3 KB
Newer Older
Ian Hickson's avatar
Ian Hickson committed
1
// Copyright 2014 The Flutter Authors. All rights reserved.
2 3 4
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

5 6
import 'package:flutter/material.dart';

7
import '../demo/all.dart';
8 9
import 'icons.dart';

10
@immutable
11
class GalleryDemoCategory {
12
  const GalleryDemoCategory._({
13 14
    required this.name,
    required this.icon,
15 16 17 18
  });

  final String name;
  final IconData icon;
19 20

  @override
21
  bool operator ==(Object other) {
22 23
    if (identical(this, other))
      return true;
24
    if (other.runtimeType != runtimeType)
25
      return false;
26
    return other is GalleryDemoCategory
27 28
        && other.name == name
        && other.icon == icon;
29 30 31 32 33 34 35 36 37 38 39
  }

  @override
  int get hashCode => hashValues(name, icon);

  @override
  String toString() {
    return '$runtimeType($name)';
  }
}

40
const GalleryDemoCategory _kDemos = GalleryDemoCategory._(
41
  name: 'Studies',
42 43
  icon: GalleryIcons.animation,
);
44

45
const GalleryDemoCategory _kStyle = GalleryDemoCategory._(
46 47 48
  name: 'Style',
  icon: GalleryIcons.custom_typography,
);
49

50
const GalleryDemoCategory _kMaterialComponents = GalleryDemoCategory._(
51 52 53 54
  name: 'Material',
  icon: GalleryIcons.category_mdc,
);

55
const GalleryDemoCategory _kCupertinoComponents = GalleryDemoCategory._(
56 57 58 59
  name: 'Cupertino',
  icon: GalleryIcons.phone_iphone,
);

60
const GalleryDemoCategory _kMedia = GalleryDemoCategory._(
61 62 63 64 65 66
  name: 'Media',
  icon: GalleryIcons.drive_video,
);

class GalleryDemo {
  const GalleryDemo({
67 68
    required this.title,
    required this.icon,
69
    this.subtitle,
70 71
    required this.category,
    required this.routeName,
72
    this.documentationUrl,
73 74
    required this.buildRoute,
  });
75 76

  final String title;
77
  final IconData icon;
78
  final String? subtitle;
79
  final GalleryDemoCategory category;
80
  final String routeName;
81
  final WidgetBuilder buildRoute;
82
  final String? documentationUrl;
83 84

  @override
85 86
  String toString() {
    return '$runtimeType($title $routeName)';
87 88
  }
}
89

90 91
List<GalleryDemo> _buildGalleryDemos() {
  final List<GalleryDemo> galleryDemos = <GalleryDemo>[
92
    // Demos
93
    GalleryDemo(
94
      title: 'Shrine',
95
      subtitle: 'Basic shopping app',
96 97
      icon: GalleryIcons.shrine,
      category: _kDemos,
98
      routeName: ShrineDemo.routeName,
99
      buildRoute: (BuildContext context) => const ShrineDemo(),
100
    ),
101 102 103 104 105 106
    GalleryDemo(
      title: 'Fortnightly',
      subtitle: 'Newspaper typography app',
      icon: GalleryIcons.custom_typography,
      category: _kDemos,
      routeName: FortnightlyDemo.routeName,
107
      buildRoute: (BuildContext context) => const FortnightlyDemo(),
108
    ),
109
    GalleryDemo(
110 111
      title: 'Contact profile',
      subtitle: 'Address book entry with a flexible appbar',
112 113
      icon: GalleryIcons.account_box,
      category: _kDemos,
114
      routeName: ContactsDemo.routeName,
115
      buildRoute: (BuildContext context) => const ContactsDemo(),
116
    ),
117
    GalleryDemo(
118 119
      title: 'Animation',
      subtitle: 'Section organizer',
120 121
      icon: GalleryIcons.animation,
      category: _kDemos,
122
      routeName: AnimationDemo.routeName,
123
      buildRoute: (BuildContext context) => const AnimationDemo(),
124
    ),
125 126 127 128 129 130 131 132
    GalleryDemo(
      title: '2D Transformations',
      subtitle: 'Pan, Zoom, Rotate',
      icon: GalleryIcons.grid_on,
      category: _kDemos,
      routeName: TransformationsDemo.routeName,
      buildRoute: (BuildContext context) => const TransformationsDemo(),
    ),
133 134 135 136 137 138 139 140
    GalleryDemo(
      title: 'Pesto',
      subtitle: 'Simple recipe browser',
      icon: Icons.adjust,
      category: _kDemos,
      routeName: PestoDemo.routeName,
      buildRoute: (BuildContext context) => const PestoDemo(),
    ),
141 142

    // Style
143
    GalleryDemo(
144 145 146 147 148
      title: 'Colors',
      subtitle: 'All of the predefined colors',
      icon: GalleryIcons.colors,
      category: _kStyle,
      routeName: ColorsDemo.routeName,
149
      buildRoute: (BuildContext context) => const ColorsDemo(),
150
    ),
151
    GalleryDemo(
152 153 154 155 156
      title: 'Typography',
      subtitle: 'All of the predefined text styles',
      icon: GalleryIcons.custom_typography,
      category: _kStyle,
      routeName: TypographyDemo.routeName,
157
      buildRoute: (BuildContext context) => const TypographyDemo(),
158
    ),
159

160
    // Material Components
161
    GalleryDemo(
162 163
      title: 'Backdrop',
      subtitle: 'Select a front layer from back layer',
164 165
      icon: GalleryIcons.backdrop,
      category: _kMaterialComponents,
166
      routeName: BackdropDemo.routeName,
167
      buildRoute: (BuildContext context) => const BackdropDemo(),
168
    ),
169 170 171 172 173 174 175 176 177
    GalleryDemo(
      title: 'Banner',
      subtitle: 'Displaying a banner within a list',
      icon: GalleryIcons.lists_leave_behind,
      category: _kMaterialComponents,
      routeName: BannerDemo.routeName,
      documentationUrl: 'https://api.flutter.dev/flutter/material/MaterialBanner-class.html',
      buildRoute: (BuildContext context) => const BannerDemo(),
    ),
178
    GalleryDemo(
179
      title: 'Bottom app bar',
180
      subtitle: 'Optional floating action button notch',
181 182
      icon: GalleryIcons.bottom_app_bar,
      category: _kMaterialComponents,
183
      routeName: BottomAppBarDemo.routeName,
184
      documentationUrl: 'https://api.flutter.dev/flutter/material/BottomAppBar-class.html',
185
      buildRoute: (BuildContext context) => const BottomAppBarDemo(),
186
    ),
187
    GalleryDemo(
188 189
      title: 'Bottom navigation',
      subtitle: 'Bottom navigation with cross-fading views',
190 191
      icon: GalleryIcons.bottom_navigation,
      category: _kMaterialComponents,
192
      routeName: BottomNavigationDemo.routeName,
193
      documentationUrl: 'https://api.flutter.dev/flutter/material/BottomNavigationBar-class.html',
194
      buildRoute: (BuildContext context) => const BottomNavigationDemo(),
195
    ),
196
    GalleryDemo(
197
      title: 'Bottom sheet: Modal',
198
      subtitle: 'A dismissible bottom sheet',
199 200 201
      icon: GalleryIcons.bottom_sheets,
      category: _kMaterialComponents,
      routeName: ModalBottomSheetDemo.routeName,
202
      documentationUrl: 'https://api.flutter.dev/flutter/material/showModalBottomSheet.html',
203
      buildRoute: (BuildContext context) => const ModalBottomSheetDemo(),
204
    ),
205
    GalleryDemo(
206 207 208 209 210
      title: 'Bottom sheet: Persistent',
      subtitle: 'A bottom sheet that sticks around',
      icon: GalleryIcons.bottom_sheet_persistent,
      category: _kMaterialComponents,
      routeName: PersistentBottomSheetDemo.routeName,
211
      documentationUrl: 'https://api.flutter.dev/flutter/material/ScaffoldState/showBottomSheet.html',
212
      buildRoute: (BuildContext context) => const PersistentBottomSheetDemo(),
213
    ),
214
    GalleryDemo(
215
      title: 'Buttons',
216
      subtitle: 'Flat, raised, dropdown, and more',
217 218
      icon: GalleryIcons.generic_buttons,
      category: _kMaterialComponents,
219
      routeName: ButtonsDemo.routeName,
220
      buildRoute: (BuildContext context) => const ButtonsDemo(),
221
    ),
222
    GalleryDemo(
223 224 225 226 227
      title: 'Buttons: Floating Action Button',
      subtitle: 'FAB with transitions',
      icon: GalleryIcons.buttons,
      category: _kMaterialComponents,
      routeName: TabsFabDemo.routeName,
228
      documentationUrl: 'https://api.flutter.dev/flutter/material/FloatingActionButton-class.html',
229
      buildRoute: (BuildContext context) => const TabsFabDemo(),
230
    ),
231
    GalleryDemo(
232
      title: 'Cards',
233
      subtitle: 'Baseline cards with rounded corners',
234 235
      icon: GalleryIcons.cards,
      category: _kMaterialComponents,
236
      routeName: CardsDemo.routeName,
237
      documentationUrl: 'https://api.flutter.dev/flutter/material/Card-class.html',
238
      buildRoute: (BuildContext context) => const CardsDemo(),
239
    ),
240
    GalleryDemo(
241
      title: 'Chips',
242
      subtitle: 'Labeled with delete buttons and avatars',
243 244
      icon: GalleryIcons.chips,
      category: _kMaterialComponents,
245
      routeName: ChipDemo.routeName,
246
      documentationUrl: 'https://api.flutter.dev/flutter/material/Chip-class.html',
247
      buildRoute: (BuildContext context) => const ChipDemo(),
248
    ),
249
    GalleryDemo(
250
      title: 'Data tables',
251
      subtitle: 'Rows and columns',
252 253
      icon: GalleryIcons.data_table,
      category: _kMaterialComponents,
254
      routeName: DataTableDemo.routeName,
255
      documentationUrl: 'https://api.flutter.dev/flutter/material/PaginatedDataTable-class.html',
256
      buildRoute: (BuildContext context) => const DataTableDemo(),
257
    ),
258
    GalleryDemo(
259 260
      title: 'Dialogs',
      subtitle: 'Simple, alert, and fullscreen',
261 262
      icon: GalleryIcons.dialogs,
      category: _kMaterialComponents,
263
      routeName: DialogDemo.routeName,
264
      documentationUrl: 'https://api.flutter.dev/flutter/material/showDialog.html',
265
      buildRoute: (BuildContext context) => const DialogDemo(),
266
    ),
267
    GalleryDemo(
268 269 270 271 272 273
      title: 'Elevations',
      subtitle: 'Shadow values on cards',
      // TODO(larche): Change to custom icon for elevations when one exists.
      icon: GalleryIcons.cupertino_progress,
      category: _kMaterialComponents,
      routeName: ElevationDemo.routeName,
274
      documentationUrl: 'https://api.flutter.dev/flutter/material/Material/elevation.html',
275
      buildRoute: (BuildContext context) => const ElevationDemo(),
276
    ),
277
    GalleryDemo(
278
      title: 'Expand/collapse list control',
279
      subtitle: 'A list with one sub-list level',
280 281
      icon: GalleryIcons.expand_all,
      category: _kMaterialComponents,
282
      routeName: ExpansionTileListDemo.routeName,
283
      documentationUrl: 'https://api.flutter.dev/flutter/material/ExpansionTile-class.html',
284
      buildRoute: (BuildContext context) => const ExpansionTileListDemo(),
285
    ),
286
    GalleryDemo(
287 288
      title: 'Expansion panels',
      subtitle: 'List of expanding panels',
289 290
      icon: GalleryIcons.expand_all,
      category: _kMaterialComponents,
Josh Soref's avatar
Josh Soref committed
291
      routeName: ExpansionPanelsDemo.routeName,
292
      documentationUrl: 'https://api.flutter.dev/flutter/material/ExpansionPanel-class.html',
293
      buildRoute: (BuildContext context) => const ExpansionPanelsDemo(),
294
    ),
295
    GalleryDemo(
296 297
      title: 'Grid',
      subtitle: 'Row and column layout',
298 299
      icon: GalleryIcons.grid_on,
      category: _kMaterialComponents,
300
      routeName: GridListDemo.routeName,
301
      documentationUrl: 'https://api.flutter.dev/flutter/widgets/GridView-class.html',
302
      buildRoute: (BuildContext context) => const GridListDemo(),
303
    ),
304
    GalleryDemo(
305
      title: 'Icons',
306
      subtitle: 'Enabled and disabled icons with opacity',
307 308
      icon: GalleryIcons.sentiment_very_satisfied,
      category: _kMaterialComponents,
309
      routeName: IconsDemo.routeName,
310
      documentationUrl: 'https://api.flutter.dev/flutter/material/IconButton-class.html',
311
      buildRoute: (BuildContext context) => const IconsDemo(),
312
    ),
313
    GalleryDemo(
314 315 316 317 318
      title: 'Lists',
      subtitle: 'Scrolling list layouts',
      icon: GalleryIcons.list_alt,
      category: _kMaterialComponents,
      routeName: ListDemo.routeName,
319
      documentationUrl: 'https://api.flutter.dev/flutter/material/ListTile-class.html',
320 321
      buildRoute: (BuildContext context) => const ListDemo(),
    ),
322
    GalleryDemo(
323
      title: 'Lists: leave-behind list items',
324
      subtitle: 'List items with hidden actions',
325 326
      icon: GalleryIcons.lists_leave_behind,
      category: _kMaterialComponents,
327
      routeName: LeaveBehindDemo.routeName,
328
      documentationUrl: 'https://api.flutter.dev/flutter/widgets/Dismissible-class.html',
329
      buildRoute: (BuildContext context) => const LeaveBehindDemo(),
330
    ),
331
    GalleryDemo(
332 333 334 335 336
      title: 'Lists: reorderable',
      subtitle: 'Reorderable lists',
      icon: GalleryIcons.list_alt,
      category: _kMaterialComponents,
      routeName: ReorderableListDemo.routeName,
337
      documentationUrl: 'https://api.flutter.dev/flutter/material/ReorderableListView-class.html',
338 339
      buildRoute: (BuildContext context) => const ReorderableListDemo(),
    ),
340
    GalleryDemo(
341 342
      title: 'Menus',
      subtitle: 'Menu buttons and simple menus',
343 344
      icon: GalleryIcons.more_vert,
      category: _kMaterialComponents,
345
      routeName: MenuDemo.routeName,
346
      documentationUrl: 'https://api.flutter.dev/flutter/material/PopupMenuButton-class.html',
347
      buildRoute: (BuildContext context) => const MenuDemo(),
348
    ),
349
    GalleryDemo(
350 351 352
      title: 'Navigation drawer',
      subtitle: 'Navigation drawer with standard header',
      icon: GalleryIcons.menu,
353
      category: _kMaterialComponents,
354
      routeName: DrawerDemo.routeName,
355
      documentationUrl: 'https://api.flutter.dev/flutter/material/Drawer-class.html',
356
      buildRoute: (BuildContext context) => const DrawerDemo(),
357
    ),
358
    GalleryDemo(
359
      title: 'Pagination',
360
      subtitle: 'PageView with indicator',
361 362
      icon: GalleryIcons.page_control,
      category: _kMaterialComponents,
363
      routeName: PageSelectorDemo.routeName,
364
      documentationUrl: 'https://api.flutter.dev/flutter/material/TabBarView-class.html',
365
      buildRoute: (BuildContext context) => const PageSelectorDemo(),
366
    ),
367
    GalleryDemo(
368 369 370
      title: 'Pickers',
      subtitle: 'Date and time selection widgets',
      icon: GalleryIcons.event,
371
      category: _kMaterialComponents,
372
      routeName: DateAndTimePickerDemo.routeName,
373
      documentationUrl: 'https://api.flutter.dev/flutter/material/showDatePicker.html',
374
      buildRoute: (BuildContext context) => const DateAndTimePickerDemo(),
375
    ),
376
    GalleryDemo(
377
      title: 'Progress indicators',
378
      subtitle: 'Linear, circular, indeterminate',
379 380
      icon: GalleryIcons.progress_activity,
      category: _kMaterialComponents,
381
      routeName: ProgressIndicatorDemo.routeName,
382
      documentationUrl: 'https://api.flutter.dev/flutter/material/LinearProgressIndicator-class.html',
383
      buildRoute: (BuildContext context) => const ProgressIndicatorDemo(),
384
    ),
385
    GalleryDemo(
386 387
      title: 'Pull to refresh',
      subtitle: 'Refresh indicators',
388 389
      icon: GalleryIcons.refresh,
      category: _kMaterialComponents,
390
      routeName: OverscrollDemo.routeName,
391
      documentationUrl: 'https://api.flutter.dev/flutter/material/RefreshIndicator-class.html',
392
      buildRoute: (BuildContext context) => const OverscrollDemo(),
393
    ),
394
    GalleryDemo(
395 396 397 398 399
      title: 'Search',
      subtitle: 'Expandable search',
      icon: Icons.search,
      category: _kMaterialComponents,
      routeName: SearchDemo.routeName,
400
      documentationUrl: 'https://api.flutter.dev/flutter/material/showSearch.html',
401
      buildRoute: (BuildContext context) => const SearchDemo(),
402
    ),
403
    GalleryDemo(
404 405
      title: 'Selection controls',
      subtitle: 'Checkboxes, radio buttons, and switches',
406 407
      icon: GalleryIcons.check_box,
      category: _kMaterialComponents,
408
      routeName: SelectionControlsDemo.routeName,
409
      buildRoute: (BuildContext context) => const SelectionControlsDemo(),
410
    ),
411
    GalleryDemo(
412
      title: 'Sliders',
413
      subtitle: 'Widgets for selecting a value by swiping',
414 415
      icon: GalleryIcons.sliders,
      category: _kMaterialComponents,
416
      routeName: SliderDemo.routeName,
417
      documentationUrl: 'https://api.flutter.dev/flutter/material/Slider-class.html',
418
      buildRoute: (BuildContext context) => const SliderDemo(),
419
    ),
420
    GalleryDemo(
421
      title: 'Snackbar',
422
      subtitle: 'Temporary messaging',
423 424
      icon: GalleryIcons.snackbar,
      category: _kMaterialComponents,
425
      routeName: SnackBarDemo.routeName,
426
      documentationUrl: 'https://api.flutter.dev/flutter/material/ScaffoldState/showSnackBar.html',
427
      buildRoute: (BuildContext context) => const SnackBarDemo(),
428
    ),
429
    GalleryDemo(
430 431
      title: 'Tabs',
      subtitle: 'Tabs with independently scrollable views',
432 433
      icon: GalleryIcons.tabs,
      category: _kMaterialComponents,
434
      routeName: TabsDemo.routeName,
435
      documentationUrl: 'https://api.flutter.dev/flutter/material/TabBarView-class.html',
436
      buildRoute: (BuildContext context) => const TabsDemo(),
437
    ),
438
    GalleryDemo(
439 440 441 442 443
      title: 'Tabs: Scrolling',
      subtitle: 'Tab bar that scrolls',
      category: _kMaterialComponents,
      icon: GalleryIcons.tabs,
      routeName: ScrollableTabsDemo.routeName,
444
      documentationUrl: 'https://api.flutter.dev/flutter/material/TabBar-class.html',
445
      buildRoute: (BuildContext context) => const ScrollableTabsDemo(),
446
    ),
447
    GalleryDemo(
448 449
      title: 'Text fields',
      subtitle: 'Single line of editable text and numbers',
450 451
      icon: GalleryIcons.text_fields_alt,
      category: _kMaterialComponents,
452
      routeName: TextFormFieldDemo.routeName,
453
      documentationUrl: 'https://api.flutter.dev/flutter/material/TextFormField-class.html',
454
      buildRoute: (BuildContext context) => const TextFormFieldDemo(),
455
    ),
456
    GalleryDemo(
457
      title: 'Tooltips',
458
      subtitle: 'Short message displayed on long-press',
459 460
      icon: GalleryIcons.tooltip,
      category: _kMaterialComponents,
461
      routeName: TooltipDemo.routeName,
462
      documentationUrl: 'https://api.flutter.dev/flutter/material/Tooltip-class.html',
463
      buildRoute: (BuildContext context) => const TooltipDemo(),
464
    ),
465

466
    // Cupertino Components
467
    GalleryDemo(
468
      title: 'Activity Indicator',
469 470
      icon: GalleryIcons.cupertino_progress,
      category: _kCupertinoComponents,
471
      routeName: CupertinoProgressIndicatorDemo.routeName,
472
      documentationUrl: 'https://api.flutter.dev/flutter/cupertino/CupertinoActivityIndicator-class.html',
473
      buildRoute: (BuildContext context) => const CupertinoProgressIndicatorDemo(),
474
    ),
475
    GalleryDemo(
476
      title: 'Alerts',
477 478
      icon: GalleryIcons.dialogs,
      category: _kCupertinoComponents,
479
      routeName: CupertinoAlertDemo.routeName,
480
      documentationUrl: 'https://api.flutter.dev/flutter/cupertino/showCupertinoDialog.html',
481
      buildRoute: (BuildContext context) => const CupertinoAlertDemo(),
482
    ),
483
    GalleryDemo(
484 485 486 487
      title: 'Buttons',
      icon: GalleryIcons.generic_buttons,
      category: _kCupertinoComponents,
      routeName: CupertinoButtonsDemo.routeName,
488
      documentationUrl: 'https://api.flutter.dev/flutter/cupertino/CupertinoButton-class.html',
489
      buildRoute: (BuildContext context) => const CupertinoButtonsDemo(),
490
    ),
491
    GalleryDemo(
492
      title: 'Navigation',
493 494
      icon: GalleryIcons.bottom_navigation,
      category: _kCupertinoComponents,
495
      routeName: CupertinoNavigationDemo.routeName,
496
      documentationUrl: 'https://api.flutter.dev/flutter/cupertino/CupertinoTabScaffold-class.html',
497
      buildRoute: (BuildContext context) => CupertinoNavigationDemo(),
498
    ),
499
    GalleryDemo(
500
      title: 'Pickers',
501 502
      icon: GalleryIcons.event,
      category: _kCupertinoComponents,
503
      routeName: CupertinoPickerDemo.routeName,
504
      documentationUrl: 'https://api.flutter.dev/flutter/cupertino/CupertinoPicker-class.html',
505
      buildRoute: (BuildContext context) => const CupertinoPickerDemo(),
506
    ),
507
    GalleryDemo(
508
      title: 'Pull to refresh',
509 510
      icon: GalleryIcons.cupertino_pull_to_refresh,
      category: _kCupertinoComponents,
511
      routeName: CupertinoRefreshControlDemo.routeName,
512
      documentationUrl: 'https://api.flutter.dev/flutter/cupertino/CupertinoSliverRefreshControl-class.html',
513
      buildRoute: (BuildContext context) => const CupertinoRefreshControlDemo(),
514
    ),
515
    GalleryDemo(
516 517 518 519
      title: 'Segmented Control',
      icon: GalleryIcons.tabs,
      category: _kCupertinoComponents,
      routeName: CupertinoSegmentedControlDemo.routeName,
520
      documentationUrl: 'https://api.flutter.dev/flutter/cupertino/CupertinoSegmentedControl-class.html',
521
      buildRoute: (BuildContext context) => const CupertinoSegmentedControlDemo(),
522
    ),
523
    GalleryDemo(
524
      title: 'Sliders',
525 526
      icon: GalleryIcons.sliders,
      category: _kCupertinoComponents,
527
      routeName: CupertinoSliderDemo.routeName,
528
      documentationUrl: 'https://api.flutter.dev/flutter/cupertino/CupertinoSlider-class.html',
529
      buildRoute: (BuildContext context) => const CupertinoSliderDemo(),
530
    ),
531
    GalleryDemo(
532
      title: 'Switches',
533 534
      icon: GalleryIcons.cupertino_switch,
      category: _kCupertinoComponents,
535
      routeName: CupertinoSwitchDemo.routeName,
536
      documentationUrl: 'https://api.flutter.dev/flutter/cupertino/CupertinoSwitch-class.html',
537
      buildRoute: (BuildContext context) => const CupertinoSwitchDemo(),
538
    ),
539 540 541 542 543
    GalleryDemo(
      title: 'Text Fields',
      icon: GalleryIcons.text_fields_alt,
      category: _kCupertinoComponents,
      routeName: CupertinoTextFieldDemo.routeName,
544
      buildRoute: (BuildContext context) => const CupertinoTextFieldDemo(),
545
    ),
546

547
    // Media
548
    GalleryDemo(
549 550
      title: 'Animated images',
      subtitle: 'GIF and WebP animations',
551 552
      icon: GalleryIcons.animation,
      category: _kMedia,
553
      routeName: ImagesDemo.routeName,
554
      buildRoute: (BuildContext context) => const ImagesDemo(),
555
    ),
556
    GalleryDemo(
557 558 559 560 561 562
      title: 'Video',
      subtitle: 'Video playback',
      icon: GalleryIcons.drive_video,
      category: _kMedia,
      routeName: VideoDemo.routeName,
      buildRoute: (BuildContext context) => const VideoDemo(),
563 564
    ),
  ];
565
  return galleryDemos;
566 567
}

568 569 570 571 572 573
final List<GalleryDemo> kAllGalleryDemos = _buildGalleryDemos();

final Set<GalleryDemoCategory> kAllGalleryDemoCategories =
  kAllGalleryDemos.map<GalleryDemoCategory>((GalleryDemo demo) => demo.category).toSet();

final Map<GalleryDemoCategory, List<GalleryDemo>> kGalleryCategoryToDemos =
574
  Map<GalleryDemoCategory, List<GalleryDemo>>.fromIterable(
575 576 577 578 579
    kAllGalleryDemoCategories,
    value: (dynamic category) {
      return kAllGalleryDemos.where((GalleryDemo demo) => demo.category == category).toList();
    },
  );
580

581
final Map<String, String?> kDemoDocumentationUrl = <String, String?>{
582 583 584
  for (final GalleryDemo demo in kAllGalleryDemos)
    if (demo.documentationUrl != null) demo.routeName: demo.documentationUrl,
};