Skip to content
This repository was archived by the owner on Jun 13, 2024. It is now read-only.

Commit 48a9d6b

Browse files
authored
Defer load demos (#423)
1 parent 37c149f commit 48a9d6b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+967
-406
lines changed

golden_test/demo_test.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ void main() {
1818
group('mobile', () {
1919
testWidgets('demo page matches golden screenshot', (tester) async {
2020
await setUpBinding(tester);
21+
await tester.runAsync<void>(pumpDeferredLibraries);
2122
await pumpWidgetWithImages(
2223
tester,
2324
const GalleryApp(initialRoute: demoBannerRoute),
@@ -33,6 +34,7 @@ void main() {
3334

3435
testWidgets('dark demo page matches golden screenshot', (tester) async {
3536
await setUpBinding(tester, brightness: Brightness.dark);
37+
await tester.runAsync<void>(pumpDeferredLibraries);
3638
await pumpWidgetWithImages(
3739
tester,
3840
const GalleryApp(initialRoute: demoBannerRoute),
@@ -50,6 +52,7 @@ void main() {
5052
group('desktop', () {
5153
testWidgets('demo page matches golden screenshot', (tester) async {
5254
await setUpBinding(tester, size: desktopSize);
55+
await tester.runAsync<void>(pumpDeferredLibraries);
5356
await pumpWidgetWithImages(
5457
tester,
5558
const GalleryApp(initialRoute: demoBannerRoute),
@@ -69,6 +72,7 @@ void main() {
6972
size: desktopSize,
7073
brightness: Brightness.dark,
7174
);
75+
await tester.runAsync<void>(pumpDeferredLibraries);
7276
await pumpWidgetWithImages(
7377
tester,
7478
const GalleryApp(initialRoute: demoBannerRoute),

lib/codeviewer/code_segments.dart

Lines changed: 251 additions & 94 deletions
Large diffs are not rendered by default.

lib/data/demos.dart

Lines changed: 351 additions & 144 deletions
Large diffs are not rendered by default.

lib/deferred_widget.dart

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
// Copyright 2019 The Flutter team. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
import 'dart:async';
6+
import 'package:flutter/material.dart';
7+
8+
typedef LibraryLoader = Future<void> Function();
9+
typedef DeferredWidgetBuilder = Widget Function();
10+
11+
/// Wraps the child inside a deferred module loader.
12+
///
13+
/// The child is created and a single instance of the Widget is maintained in
14+
/// state as long as closure to create widget stays the same.
15+
///
16+
class DeferredWidget extends StatefulWidget {
17+
DeferredWidget(this.libraryLoader, this.createWidget, {Key key})
18+
: super(key: key);
19+
20+
final LibraryLoader libraryLoader;
21+
final DeferredWidgetBuilder createWidget;
22+
static final Map<LibraryLoader, Future<void>> _moduleLoaders = {};
23+
static final Set<LibraryLoader> _loadedModules = {};
24+
25+
static Future<void> preload(LibraryLoader loader) {
26+
if (!_moduleLoaders.containsKey(loader)) {
27+
_moduleLoaders[loader] = loader().then((dynamic _) {
28+
_loadedModules.add(loader);
29+
});
30+
}
31+
return _moduleLoaders[loader];
32+
}
33+
34+
@override
35+
_DeferredWidgetState createState() => _DeferredWidgetState();
36+
}
37+
38+
class _DeferredWidgetState extends State<DeferredWidget> {
39+
_DeferredWidgetState();
40+
Widget _loadedChild;
41+
DeferredWidgetBuilder _loadedCreator;
42+
43+
@override
44+
void initState() {
45+
/// If module was already loaded immediately create widget instead of
46+
/// waiting for future or zone turn.
47+
if (DeferredWidget._loadedModules.contains(widget.libraryLoader)) {
48+
_onLibraryLoaded();
49+
} else {
50+
DeferredWidget.preload(widget.libraryLoader)
51+
.then((dynamic _) => _onLibraryLoaded());
52+
}
53+
super.initState();
54+
}
55+
56+
void _onLibraryLoaded() {
57+
setState(() {
58+
_loadedCreator = widget.createWidget;
59+
_loadedChild = _loadedCreator();
60+
});
61+
}
62+
63+
@override
64+
Widget build(BuildContext context) {
65+
/// If closure to create widget changed, create new instance, otherwise
66+
/// treat as const Widget.
67+
if (_loadedCreator != widget.createWidget && _loadedCreator != null) {
68+
_loadedCreator = widget.createWidget;
69+
_loadedChild = _loadedCreator();
70+
}
71+
return _loadedChild ?? Container();
72+
}
73+
}

lib/demos/cupertino/cupertino_alert_demo.dart

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,10 @@ import 'package:flutter/cupertino.dart';
66

77
import 'package:flutter_gen/gen_l10n/gallery_localizations.dart';
88
import 'package:gallery/data/gallery_options.dart';
9+
import 'package:gallery/demos/cupertino/demo_types.dart';
910

1011
// BEGIN cupertinoAlertDemo
1112

12-
enum AlertDemoType {
13-
alert,
14-
alertTitle,
15-
alertButtons,
16-
alertButtonsOnly,
17-
actionSheet,
18-
}
19-
2013
class CupertinoAlertDemo extends StatefulWidget {
2114
const CupertinoAlertDemo({
2215
Key key,
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
export 'package:gallery/demos/cupertino/cupertino_activity_indicator_demo.dart';
2+
export 'package:gallery/demos/cupertino/cupertino_alert_demo.dart';
3+
export 'package:gallery/demos/cupertino/cupertino_button_demo.dart';
4+
export 'package:gallery/demos/cupertino/cupertino_context_menu_demo.dart';
5+
export 'package:gallery/demos/cupertino/cupertino_navigation_bar_demo.dart';
6+
export 'package:gallery/demos/cupertino/cupertino_picker_demo.dart';
7+
export 'package:gallery/demos/cupertino/cupertino_refresh_demo.dart';
8+
export 'package:gallery/demos/cupertino/cupertino_segmented_control_demo.dart';
9+
export 'package:gallery/demos/cupertino/cupertino_slider_demo.dart';
10+
export 'package:gallery/demos/cupertino/cupertino_switch_demo.dart';
11+
export 'package:gallery/demos/cupertino/cupertino_tab_bar_demo.dart';
12+
export 'package:gallery/demos/cupertino/cupertino_text_field_demo.dart';

lib/demos/cupertino/demo_types.dart

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
enum AlertDemoType {
2+
alert,
3+
alertTitle,
4+
alertButtons,
5+
alertButtonsOnly,
6+
actionSheet,
7+
}

lib/demos/material/bottom_navigation_demo.dart

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,11 @@
55
import 'package:flutter/material.dart';
66
import 'package:animations/animations.dart';
77

8+
import 'package:gallery/demos/material/material_demo_types.dart';
89
import 'package:flutter_gen/gen_l10n/gallery_localizations.dart';
910

1011
// BEGIN bottomNavigationDemo
1112

12-
enum BottomNavigationDemoType {
13-
withLabels,
14-
withoutLabels,
15-
}
16-
1713
class BottomNavigationDemo extends StatefulWidget {
1814
const BottomNavigationDemo({
1915
Key key,

lib/demos/material/bottom_sheet_demo.dart

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,7 @@
55
import 'package:flutter/material.dart';
66

77
import 'package:flutter_gen/gen_l10n/gallery_localizations.dart';
8-
9-
enum BottomSheetDemoType {
10-
persistent,
11-
modal,
12-
}
8+
import 'package:gallery/demos/material/material_demo_types.dart';
139

1410
class BottomSheetDemo extends StatelessWidget {
1511
const BottomSheetDemo({

lib/demos/material/button_demo.dart

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,7 @@
55
import 'package:flutter/material.dart';
66

77
import 'package:flutter_gen/gen_l10n/gallery_localizations.dart';
8-
9-
enum ButtonDemoType {
10-
text,
11-
elevated,
12-
outlined,
13-
toggle,
14-
floating,
15-
}
8+
import 'package:gallery/demos/material/material_demo_types.dart';
169

1710
class ButtonDemo extends StatelessWidget {
1811
const ButtonDemo({Key key, this.type}) : super(key: key);

lib/demos/material/chip_demo.dart

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,7 @@
44

55
import 'package:flutter/material.dart';
66
import 'package:flutter_gen/gen_l10n/gallery_localizations.dart';
7-
8-
enum ChipDemoType {
9-
action,
10-
choice,
11-
filter,
12-
input,
13-
}
7+
import 'package:gallery/demos/material/material_demo_types.dart';
148

159
class ChipDemo extends StatelessWidget {
1610
const ChipDemo({

lib/demos/material/dialog_demo.dart

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,11 @@
55
import 'package:flutter/material.dart';
66

77
import 'package:gallery/data/gallery_options.dart';
8+
import 'package:gallery/demos/material/material_demo_types.dart';
89
import 'package:flutter_gen/gen_l10n/gallery_localizations.dart';
910

1011
// BEGIN dialogDemo
1112

12-
enum DialogDemoType {
13-
alert,
14-
alertTitle,
15-
simple,
16-
fullscreen,
17-
}
18-
1913
class DialogDemo extends StatelessWidget {
2014
DialogDemo({Key key, @required this.type}) : super(key: key);
2115

lib/demos/material/divider_demo.dart

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,9 @@
33
// found in the LICENSE file.
44

55
import 'package:flutter/material.dart';
6+
import 'package:gallery/demos/material/material_demo_types.dart';
67
import 'package:flutter_gen/gen_l10n/gallery_localizations.dart';
78

8-
enum DividerDemoType {
9-
horizontal,
10-
vertical,
11-
}
12-
139
class DividerDemo extends StatelessWidget {
1410
const DividerDemo({Key key, this.type}) : super(key: key);
1511

lib/demos/material/grid_list_demo.dart

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,10 @@
44

55
import 'package:flutter/material.dart';
66
import 'package:flutter_gen/gen_l10n/gallery_localizations.dart';
7+
import 'package:gallery/demos/material/material_demo_types.dart';
78

89
// BEGIN gridListsDemo
910

10-
enum GridListDemoType {
11-
imageOnly,
12-
header,
13-
footer,
14-
}
15-
1611
class GridListDemo extends StatelessWidget {
1712
const GridListDemo({Key key, this.type}) : super(key: key);
1813

lib/demos/material/list_demo.dart

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,10 @@
55
import 'package:flutter/material.dart';
66

77
import 'package:flutter_gen/gen_l10n/gallery_localizations.dart';
8+
import 'package:gallery/demos/material/material_demo_types.dart';
89

910
// BEGIN listDemo
1011

11-
enum ListDemoType {
12-
oneLine,
13-
twoLine,
14-
}
15-
1612
class ListDemo extends StatelessWidget {
1713
const ListDemo({Key key, this.type}) : super(key: key);
1814

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
enum BottomNavigationDemoType {
2+
withLabels,
3+
withoutLabels,
4+
}
5+
6+
enum BottomSheetDemoType {
7+
persistent,
8+
modal,
9+
}
10+
11+
enum ButtonDemoType {
12+
text,
13+
elevated,
14+
outlined,
15+
toggle,
16+
floating,
17+
}
18+
19+
enum ChipDemoType {
20+
action,
21+
choice,
22+
filter,
23+
input,
24+
}
25+
26+
enum DialogDemoType {
27+
alert,
28+
alertTitle,
29+
simple,
30+
fullscreen,
31+
}
32+
33+
enum GridListDemoType {
34+
imageOnly,
35+
header,
36+
footer,
37+
}
38+
39+
enum ListDemoType {
40+
oneLine,
41+
twoLine,
42+
}
43+
44+
enum MenuDemoType {
45+
contextMenu,
46+
sectionedMenu,
47+
simpleMenu,
48+
checklistMenu,
49+
}
50+
51+
enum PickerDemoType {
52+
date,
53+
time,
54+
range,
55+
}
56+
57+
enum ProgressIndicatorDemoType {
58+
circular,
59+
linear,
60+
}
61+
62+
enum SelectionControlsDemoType {
63+
checkbox,
64+
radio,
65+
switches,
66+
}
67+
68+
enum SlidersDemoType {
69+
sliders,
70+
rangeSliders,
71+
customSliders,
72+
}
73+
74+
enum TabsDemoType {
75+
scrollable,
76+
nonScrollable,
77+
}
78+
79+
enum DividerDemoType {
80+
horizontal,
81+
vertical,
82+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
export 'package:gallery/demos/material/banner_demo.dart';
2+
export 'package:gallery/demos/material/bottom_app_bar_demo.dart';
3+
export 'package:gallery/demos/material/bottom_navigation_demo.dart';
4+
export 'package:gallery/demos/material/bottom_sheet_demo.dart';
5+
export 'package:gallery/demos/material/button_demo.dart';
6+
export 'package:gallery/demos/material/cards_demo.dart';
7+
export 'package:gallery/demos/material/chip_demo.dart';
8+
export 'package:gallery/demos/material/data_table_demo.dart';
9+
export 'package:gallery/demos/material/dialog_demo.dart';
10+
export 'package:gallery/demos/material/divider_demo.dart';
11+
export 'package:gallery/demos/material/grid_list_demo.dart';
12+
export 'package:gallery/demos/material/list_demo.dart';
13+
export 'package:gallery/demos/material/menu_demo.dart';
14+
export 'package:gallery/demos/material/navigation_drawer.dart';
15+
export 'package:gallery/demos/material/navigation_rail_demo.dart';
16+
export 'package:gallery/demos/material/picker_demo.dart';
17+
export 'package:gallery/demos/material/progress_indicator_demo.dart';
18+
export 'package:gallery/demos/material/selection_controls_demo.dart';
19+
export 'package:gallery/demos/material/sliders_demo.dart';
20+
export 'package:gallery/demos/material/snackbar_demo.dart';
21+
export 'package:gallery/demos/material/tabs_demo.dart';
22+
export 'package:gallery/demos/material/text_field_demo.dart';
23+
export 'package:gallery/demos/material/tooltip_demo.dart';
24+
export 'package:gallery/demos/material/app_bar_demo.dart';

lib/demos/material/menu_demo.dart

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,7 @@
55
import 'package:flutter/material.dart';
66

77
import 'package:flutter_gen/gen_l10n/gallery_localizations.dart';
8-
9-
enum MenuDemoType {
10-
contextMenu,
11-
sectionedMenu,
12-
simpleMenu,
13-
checklistMenu,
14-
}
8+
import 'package:gallery/demos/material/material_demo_types.dart';
159

1610
enum SimpleValue {
1711
one,

0 commit comments

Comments
 (0)