Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in
Toggle navigation
F
Front-End
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
abdullh.alsoleman
Front-End
Commits
75b24070
Unverified
Commit
75b24070
authored
Sep 28, 2018
by
xster
Committed by
GitHub
Sep 28, 2018
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add API docs link to each gallery demo (#22379)
parent
c60560fb
Changes
43
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
43 changed files
with
300 additions
and
35 deletions
+300
-35
cupertino_activity_indicator_demo.dart
...lib/demo/cupertino/cupertino_activity_indicator_demo.dart
+8
-5
cupertino_alert_demo.dart
...tter_gallery/lib/demo/cupertino/cupertino_alert_demo.dart
+3
-0
cupertino_buttons_demo.dart
...er_gallery/lib/demo/cupertino/cupertino_buttons_demo.dart
+3
-0
cupertino_navigation_demo.dart
...gallery/lib/demo/cupertino/cupertino_navigation_demo.dart
+17
-6
cupertino_picker_demo.dart
...ter_gallery/lib/demo/cupertino/cupertino_picker_demo.dart
+2
-0
cupertino_refresh_demo.dart
...er_gallery/lib/demo/cupertino/cupertino_refresh_demo.dart
+5
-2
cupertino_segmented_control_demo.dart
.../lib/demo/cupertino/cupertino_segmented_control_demo.dart
+3
-0
cupertino_slider_demo.dart
...ter_gallery/lib/demo/cupertino/cupertino_slider_demo.dart
+3
-0
cupertino_switch_demo.dart
...ter_gallery/lib/demo/cupertino/cupertino_switch_demo.dart
+3
-0
bottom_app_bar_demo.dart
...lutter_gallery/lib/demo/material/bottom_app_bar_demo.dart
+3
-0
bottom_navigation_demo.dart
...ter_gallery/lib/demo/material/bottom_navigation_demo.dart
+3
-0
buttons_demo.dart
examples/flutter_gallery/lib/demo/material/buttons_demo.dart
+6
-0
cards_demo.dart
examples/flutter_gallery/lib/demo/material/cards_demo.dart
+3
-0
chip_demo.dart
examples/flutter_gallery/lib/demo/material/chip_demo.dart
+3
-0
data_table_demo.dart
...es/flutter_gallery/lib/demo/material/data_table_demo.dart
+8
-1
date_and_time_picker_demo.dart
..._gallery/lib/demo/material/date_and_time_picker_demo.dart
+6
-1
dialog_demo.dart
examples/flutter_gallery/lib/demo/material/dialog_demo.dart
+3
-1
drawer_demo.dart
examples/flutter_gallery/lib/demo/material/drawer_demo.dart
+3
-0
elevation_demo.dart
...les/flutter_gallery/lib/demo/material/elevation_demo.dart
+3
-0
expansion_panels_demo.dart
...tter_gallery/lib/demo/material/expansion_panels_demo.dart
+8
-1
grid_list_demo.dart
...les/flutter_gallery/lib/demo/material/grid_list_demo.dart
+3
-0
icons_demo.dart
examples/flutter_gallery/lib/demo/material/icons_demo.dart
+4
-1
leave_behind_demo.dart
.../flutter_gallery/lib/demo/material/leave_behind_demo.dart
+3
-0
list_demo.dart
examples/flutter_gallery/lib/demo/material/list_demo.dart
+3
-0
menu_demo.dart
examples/flutter_gallery/lib/demo/material/menu_demo.dart
+3
-0
modal_bottom_sheet_demo.dart
...er_gallery/lib/demo/material/modal_bottom_sheet_demo.dart
+6
-1
overscroll_demo.dart
...es/flutter_gallery/lib/demo/material/overscroll_demo.dart
+3
-0
page_selector_demo.dart
...flutter_gallery/lib/demo/material/page_selector_demo.dart
+6
-1
persistent_bottom_sheet_demo.dart
...llery/lib/demo/material/persistent_bottom_sheet_demo.dart
+8
-1
progress_indicator_demo.dart
...er_gallery/lib/demo/material/progress_indicator_demo.dart
+6
-1
reorderable_list_demo.dart
...tter_gallery/lib/demo/material/reorderable_list_demo.dart
+3
-0
scrollable_tabs_demo.dart
...utter_gallery/lib/demo/material/scrollable_tabs_demo.dart
+3
-0
search_demo.dart
examples/flutter_gallery/lib/demo/material/search_demo.dart
+3
-0
selection_controls_demo.dart
...er_gallery/lib/demo/material/selection_controls_demo.dart
+6
-3
slider_demo.dart
examples/flutter_gallery/lib/demo/material/slider_demo.dart
+6
-1
snack_bar_demo.dart
...les/flutter_gallery/lib/demo/material/snack_bar_demo.dart
+4
-1
tabs_demo.dart
examples/flutter_gallery/lib/demo/material/tabs_demo.dart
+3
-0
tabs_fab_demo.dart
...ples/flutter_gallery/lib/demo/material/tabs_fab_demo.dart
+3
-0
text_form_field_demo.dart
...utter_gallery/lib/demo/material/text_form_field_demo.dart
+3
-0
tooltip_demo.dart
examples/flutter_gallery/lib/demo/material/tooltip_demo.dart
+4
-1
two_level_list_demo.dart
...lutter_gallery/lib/demo/material/two_level_list_demo.dart
+6
-1
demo.dart
examples/flutter_gallery/lib/gallery/demo.dart
+67
-6
demos.dart
examples/flutter_gallery/lib/gallery/demos.dart
+48
-0
No files found.
examples/flutter_gallery/lib/demo/cupertino/cupertino_activity_indicator_demo.dart
View file @
75b24070
...
...
@@ -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
(),
),
);
...
...
examples/flutter_gallery/lib/demo/cupertino/cupertino_alert_demo.dart
View file @
75b24070
...
...
@@ -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<CupertinoAlertDemo> {
key:
_scaffoldKey
,
appBar:
AppBar
(
title:
const
Text
(
'Cupertino Alerts'
),
actions:
<
Widget
>[
MaterialDemoDocumentationButton
(
CupertinoAlertDemo
.
routeName
)],
),
body:
ListView
(
padding:
const
EdgeInsets
.
symmetric
(
vertical:
24.0
,
horizontal:
72.0
),
...
...
examples/flutter_gallery/lib/demo/cupertino/cupertino_buttons_demo.dart
View file @
75b24070
...
...
@@ -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<CupertinoButtonsDemo> {
return
Scaffold
(
appBar:
AppBar
(
title:
const
Text
(
'Cupertino Buttons'
),
actions:
<
Widget
>[
MaterialDemoDocumentationButton
(
CupertinoButtonsDemo
.
routeName
)],
),
body:
Column
(
children:
<
Widget
>
[
...
...
examples/flutter_gallery/lib/demo/cupertino/cupertino_navigation_demo.dart
View file @
75b24070
...
...
@@ -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
<
Color
>
coolColors
=
<
Color
>[
...
...
@@ -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
{
const
CupertinoDemoTab1
({
this
.
colorItems
,
this
.
colorNameItems
});
...
...
@@ -136,8 +147,8 @@ class CupertinoDemoTab1 extends StatelessWidget {
return
CupertinoPageScaffold
(
child:
CustomScrollView
(
slivers:
<
Widget
>[
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:
<
Widget
>[
...
...
@@ -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
)),
...
...
examples/flutter_gallery/lib/demo/cupertino/cupertino_picker_demo.dart
View file @
75b24070
...
...
@@ -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<CupertinoPickerDemo> {
return
Scaffold
(
appBar:
AppBar
(
title:
const
Text
(
'Cupertino Picker'
),
actions:
<
Widget
>[
MaterialDemoDocumentationButton
(
CupertinoPickerDemo
.
routeName
)],
),
body:
DefaultTextStyle
(
style:
const
TextStyle
(
...
...
examples/flutter_gallery/lib/demo/cupertino/cupertino_refresh_demo.dart
View file @
75b24070
...
...
@@ -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<CupertinoRefreshControlDem
decoration:
const
BoxDecoration
(
color:
Color
(
0xFFEFEFF4
)),
child:
CustomScrollView
(
slivers:
<
Widget
>[
const
CupertinoSliverNavigationBar
(
largeTitle:
Text
(
'Cupertino Refresh'
),
CupertinoSliverNavigationBar
(
largeTitle:
const
Text
(
'Cupertino Refresh'
),
previousPageTitle:
'Cupertino'
,
trailing:
CupertinoDemoDocumentationButton
(
CupertinoRefreshControlDemo
.
routeName
),
),
CupertinoSliverRefreshControl
(
onRefresh:
()
{
...
...
examples/flutter_gallery/lib/demo/cupertino/cupertino_segmented_control_demo.dart
View file @
75b24070
...
...
@@ -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<CupertinoSegmentedContro
return
Scaffold
(
appBar:
AppBar
(
title:
const
Text
(
'Segmented Control'
),
actions:
<
Widget
>[
MaterialDemoDocumentationButton
(
CupertinoSegmentedControlDemo
.
routeName
)],
),
body:
Column
(
children:
<
Widget
>[
...
...
examples/flutter_gallery/lib/demo/cupertino/cupertino_slider_demo.dart
View file @
75b24070
...
...
@@ -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<CupertinoSliderDemo> {
return
Scaffold
(
appBar:
AppBar
(
title:
const
Text
(
'Cupertino Sliders'
),
actions:
<
Widget
>[
MaterialDemoDocumentationButton
(
CupertinoSliderDemo
.
routeName
)],
),
body:
Center
(
child:
Column
(
...
...
examples/flutter_gallery/lib/demo/cupertino/cupertino_switch_demo.dart
View file @
75b24070
...
...
@@ -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<CupertinoSwitchDemo> {
return
Scaffold
(
appBar:
AppBar
(
title:
const
Text
(
'Cupertino Switch'
),
actions:
<
Widget
>[
MaterialDemoDocumentationButton
(
CupertinoSwitchDemo
.
routeName
)],
),
body:
Center
(
child:
Column
(
...
...
examples/flutter_gallery/lib/demo/material/bottom_app_bar_demo.dart
View file @
75b24070
...
...
@@ -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<BottomAppBarDemo> {
title:
const
Text
(
'Bottom app bar'
),
elevation:
0.0
,
actions:
<
Widget
>[
MaterialDemoDocumentationButton
(
BottomAppBarDemo
.
routeName
),
IconButton
(
icon:
const
Icon
(
Icons
.
sentiment_very_satisfied
),
onPressed:
()
{
...
...
examples/flutter_gallery/lib/demo/material/bottom_navigation_demo.dart
View file @
75b24070
...
...
@@ -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<BottomNavigationDemo>
appBar:
AppBar
(
title:
const
Text
(
'Bottom navigation'
),
actions:
<
Widget
>[
MaterialDemoDocumentationButton
(
BottomNavigationDemo
.
routeName
),
PopupMenuButton
<
BottomNavigationBarType
>(
onSelected:
(
BottomNavigationBarType
value
)
{
setState
(()
{
...
...
examples/flutter_gallery/lib/demo/material/buttons_demo.dart
View file @
75b24070
...
...
@@ -70,6 +70,7 @@ class _ButtonsDemoState extends State<ButtonsDemo> {
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<ButtonsDemo> {
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<ButtonsDemo> {
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'
,
),
];
...
...
examples/flutter_gallery/lib/demo/material/cards_demo.dart
View file @
75b24070
...
...
@@ -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<CardsDemo> {
appBar:
AppBar
(
title:
const
Text
(
'Travel stream'
),
actions:
<
Widget
>[
MaterialDemoDocumentationButton
(
CardsDemo
.
routeName
),
IconButton
(
icon:
const
Icon
(
Icons
.
sentiment_very_satisfied
),
onPressed:
()
{
...
...
examples/flutter_gallery/lib/demo/material/chip_demo.dart
View file @
75b24070
...
...
@@ -4,6 +4,8 @@
import
'package:flutter/material.dart'
;
import
'../../gallery/demo.dart'
;
const
List
<
String
>
_defaultMaterials
=
<
String
>[
'poker'
,
'tortilla'
,
...
...
@@ -303,6 +305,7 @@ class _ChipDemoState extends State<ChipDemo> {
appBar:
AppBar
(
title:
const
Text
(
'Chips'
),
actions:
<
Widget
>[
MaterialDemoDocumentationButton
(
ChipDemo
.
routeName
),
IconButton
(
onPressed:
()
{
setState
(()
{
...
...
examples/flutter_gallery/lib/demo/material/data_table_demo.dart
View file @
75b24070
...
...
@@ -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<DataTableDemo> {
@override
Widget
build
(
BuildContext
context
)
{
return
Scaffold
(
appBar:
AppBar
(
title:
const
Text
(
'Data tables'
)),
appBar:
AppBar
(
title:
const
Text
(
'Data tables'
),
actions:
<
Widget
>[
MaterialDemoDocumentationButton
(
DataTableDemo
.
routeName
),
],
),
body:
ListView
(
padding:
const
EdgeInsets
.
all
(
20.0
),
children:
<
Widget
>[
...
...
examples/flutter_gallery/lib/demo/material/date_and_time_picker_demo.dart
View file @
75b24070
...
...
@@ -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<DateAndTimePickerDemo> {
@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:
<
Widget
>[
MaterialDemoDocumentationButton
(
DateAndTimePickerDemo
.
routeName
)],
),
body:
DropdownButtonHideUnderline
(
child:
SafeArea
(
top:
false
,
...
...
examples/flutter_gallery/lib/demo/material/dialog_demo.dart
View file @
75b24070
...
...
@@ -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<DialogDemo> {
return
Scaffold
(
key:
_scaffoldKey
,
appBar:
AppBar
(
title:
const
Text
(
'Dialogs'
)
title:
const
Text
(
'Dialogs'
),
actions:
<
Widget
>[
MaterialDemoDocumentationButton
(
DialogDemo
.
routeName
)],
),
body:
ListView
(
padding:
const
EdgeInsets
.
symmetric
(
vertical:
24.0
,
horizontal:
72.0
),
...
...
examples/flutter_gallery/lib/demo/material/drawer_demo.dart
View file @
75b24070
...
...
@@ -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<DrawerDemo> with TickerProviderStateMixin {
},
),
title:
const
Text
(
'Navigation drawer'
),
actions:
<
Widget
>[
MaterialDemoDocumentationButton
(
DrawerDemo
.
routeName
)],
),
drawer:
Drawer
(
child:
Column
(
...
...
examples/flutter_gallery/lib/demo/material/elevation_demo.dart
View file @
75b24070
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<ElevationDemo> {
appBar:
AppBar
(
title:
const
Text
(
'Elevation'
),
actions:
<
Widget
>[
MaterialDemoDocumentationButton
(
ElevationDemo
.
routeName
),
IconButton
(
icon:
const
Icon
(
Icons
.
sentiment_very_satisfied
),
onPressed:
()
{
...
...
examples/flutter_gallery/lib/demo/material/expansion_panels_demo.dart
View file @
75b24070
...
...
@@ -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<ExpansionPanelsDemo> {
@override
Widget
build
(
BuildContext
context
)
{
return
Scaffold
(
appBar:
AppBar
(
title:
const
Text
(
'Expansion panels'
)),
appBar:
AppBar
(
title:
const
Text
(
'Expansion panels'
),
actions:
<
Widget
>[
MaterialDemoDocumentationButton
(
ExpansionPanelsDemo
.
routeName
),
],
),
body:
SingleChildScrollView
(
child:
SafeArea
(
top:
false
,
...
...
examples/flutter_gallery/lib/demo/material/grid_list_demo.dart
View file @
75b24070
...
...
@@ -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<GridListDemo> {
appBar:
AppBar
(
title:
const
Text
(
'Grid list'
),
actions:
<
Widget
>[
MaterialDemoDocumentationButton
(
GridListDemo
.
routeName
),
PopupMenuButton
<
GridDemoTileStyle
>(
onSelected:
changeTileStyle
,
itemBuilder:
(
BuildContext
context
)
=>
<
PopupMenuItem
<
GridDemoTileStyle
>>[
...
...
examples/flutter_gallery/lib/demo/material/icons_demo.dart
View file @
75b24070
...
...
@@ -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<IconsDemo> {
Widget
build
(
BuildContext
context
)
{
return
Scaffold
(
appBar:
AppBar
(
title:
const
Text
(
'Icons'
)
title:
const
Text
(
'Icons'
),
actions:
<
Widget
>[
MaterialDemoDocumentationButton
(
IconsDemo
.
routeName
)],
),
body:
IconTheme
(
data:
IconThemeData
(
color:
iconColor
),
...
...
examples/flutter_gallery/lib/demo/material/leave_behind_demo.dart
View file @
75b24070
...
...
@@ -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<LeaveBehindDemo> {
appBar:
AppBar
(
title:
const
Text
(
'Swipe to dismiss'
),
actions:
<
Widget
>[
MaterialDemoDocumentationButton
(
LeaveBehindDemo
.
routeName
),
PopupMenuButton
<
LeaveBehindDemoAction
>(
onSelected:
handleDemoAction
,
itemBuilder:
(
BuildContext
context
)
=>
<
PopupMenuEntry
<
LeaveBehindDemoAction
>>[
...
...
examples/flutter_gallery/lib/demo/material/list_demo.dart
View file @
75b24070
...
...
@@ -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<ListDemo> {
appBar:
AppBar
(
title:
Text
(
'Scrolling list
\n
$itemTypeText$layoutText
'
),
actions:
<
Widget
>[
MaterialDemoDocumentationButton
(
ListDemo
.
routeName
),
IconButton
(
icon:
const
Icon
(
Icons
.
sort_by_alpha
),
tooltip:
'Sort'
,
...
...
examples/flutter_gallery/lib/demo/material/menu_demo.dart
View file @
75b24070
...
...
@@ -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<MenuDemo> {
appBar:
AppBar
(
title:
const
Text
(
'Menus'
),
actions:
<
Widget
>[
MaterialDemoDocumentationButton
(
MenuDemo
.
routeName
),
PopupMenuButton
<
String
>(
onSelected:
showMenuSelection
,
itemBuilder:
(
BuildContext
context
)
=>
<
PopupMenuItem
<
String
>>[
...
...
examples/flutter_gallery/lib/demo/material/modal_bottom_sheet_demo.dart
View file @
75b24070
...
...
@@ -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:
<
Widget
>[
MaterialDemoDocumentationButton
(
routeName
)],
),
body:
Center
(
child:
RaisedButton
(
child:
const
Text
(
'SHOW BOTTOM SHEET'
),
...
...
examples/flutter_gallery/lib/demo/material/overscroll_demo.dart
View file @
75b24070
...
...
@@ -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<OverscrollDemo> {
appBar:
AppBar
(
title:
const
Text
(
'Pull to refresh'
),
actions:
<
Widget
>[
MaterialDemoDocumentationButton
(
OverscrollDemo
.
routeName
),
IconButton
(
icon:
const
Icon
(
Icons
.
refresh
),
tooltip:
'Refresh'
,
...
...
examples/flutter_gallery/lib/demo/material/page_selector_demo.dart
View file @
75b24070
...
...
@@ -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:
<
Widget
>[
MaterialDemoDocumentationButton
(
routeName
)],
),
body:
DefaultTabController
(
length:
icons
.
length
,
child:
_PageSelector
(
icons:
icons
),
...
...
examples/flutter_gallery/lib/demo/material/persistent_bottom_sheet_demo.dart
View file @
75b24070
...
...
@@ -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<PersistentBottomSheetDemo> {
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:
<
Widget
>[
MaterialDemoDocumentationButton
(
PersistentBottomSheetDemo
.
routeName
),
],
),
floatingActionButton:
FloatingActionButton
(
onPressed:
_showMessage
,
backgroundColor:
Colors
.
redAccent
,
...
...
examples/flutter_gallery/lib/demo/material/progress_indicator_demo.dart
View file @
75b24070
...
...
@@ -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<ProgressIndicatorDemo> with Sing
@override
Widget
build
(
BuildContext
context
)
{
return
Scaffold
(
appBar:
AppBar
(
title:
const
Text
(
'Progress indicators'
)),
appBar:
AppBar
(
title:
const
Text
(
'Progress indicators'
),
actions:
<
Widget
>[
MaterialDemoDocumentationButton
(
ProgressIndicatorDemo
.
routeName
)],
),
body:
Center
(
child:
SingleChildScrollView
(
child:
DefaultTextStyle
(
...
...
examples/flutter_gallery/lib/demo/material/reorderable_list_demo.dart
View file @
75b24070
...
...
@@ -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<ReorderableListDemo> {
appBar:
AppBar
(
title:
const
Text
(
'Reorderable list'
),
actions:
<
Widget
>[
MaterialDemoDocumentationButton
(
ReorderableListDemo
.
routeName
),
IconButton
(
icon:
const
Icon
(
Icons
.
sort_by_alpha
),
tooltip:
'Sort'
,
...
...
examples/flutter_gallery/lib/demo/material/scrollable_tabs_demo.dart
View file @
75b24070
...
...
@@ -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<ScrollableTabsDemo> with SingleTicke
appBar:
AppBar
(
title:
const
Text
(
'Scrollable tabs'
),
actions:
<
Widget
>[
MaterialDemoDocumentationButton
(
ScrollableTabsDemo
.
routeName
),
IconButton
(
icon:
const
Icon
(
Icons
.
sentiment_very_satisfied
),
onPressed:
()
{
...
...
examples/flutter_gallery/lib/demo/material/search_demo.dart
View file @
75b24070
...
...
@@ -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<SearchDemo> {
}
},
),
MaterialDemoDocumentationButton
(
SearchDemo
.
routeName
),
IconButton
(
tooltip:
'More (not implemented)'
,
icon:
Icon
(
...
...
examples/flutter_gallery/lib/demo/material/selection_controls_demo.dart
View file @
75b24070
...
...
@@ -42,19 +42,22 @@ class _SelectionControlsDemoState extends State<SelectionControlsDemo> {
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'
,
)
];
...
...
examples/flutter_gallery/lib/demo/material/slider_demo.dart
View file @
75b24070
...
...
@@ -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<SliderDemo> {
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:
<
Widget
>[
MaterialDemoDocumentationButton
(
SliderDemo
.
routeName
)],
),
body:
Padding
(
padding:
const
EdgeInsets
.
symmetric
(
horizontal:
40.0
),
child:
Column
(
...
...
examples/flutter_gallery/lib/demo/material/snack_bar_demo.dart
View file @
75b24070
...
...
@@ -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<SnackBarDemo> {
Widget
build
(
BuildContext
context
)
{
return
Scaffold
(
appBar:
AppBar
(
title:
const
Text
(
'Snackbar'
)
title:
const
Text
(
'Snackbar'
),
actions:
<
Widget
>[
MaterialDemoDocumentationButton
(
SnackBarDemo
.
routeName
)],
),
body:
Builder
(
// Create an inner BuildContext so that the snackBar onPressed methods
...
...
examples/flutter_gallery/lib/demo/material/tabs_demo.dart
View file @
75b24070
...
...
@@ -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:
<
Widget
>[
MaterialDemoDocumentationButton
(
routeName
)],
pinned:
true
,
expandedHeight:
150.0
,
forceElevated:
innerBoxIsScrolled
,
...
...
examples/flutter_gallery/lib/demo/material/tabs_fab_demo.dart
View file @
75b24070
...
...
@@ -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<TabsFabDemo> with SingleTickerProviderStat
tabs:
_allPages
.
map
((
_Page
page
)
=>
Tab
(
text:
page
.
label
.
toUpperCase
())).
toList
(),
),
actions:
<
Widget
>[
MaterialDemoDocumentationButton
(
TabsFabDemo
.
routeName
),
IconButton
(
icon:
const
Icon
(
Icons
.
sentiment_very_satisfied
),
onPressed:
()
{
...
...
examples/flutter_gallery/lib/demo/material/text_form_field_demo.dart
View file @
75b24070
...
...
@@ -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<TextFormFieldDemo> {
key:
_scaffoldKey
,
appBar:
AppBar
(
title:
const
Text
(
'Text fields'
),
actions:
<
Widget
>[
MaterialDemoDocumentationButton
(
TextFormFieldDemo
.
routeName
)],
),
body:
SafeArea
(
top:
false
,
...
...
examples/flutter_gallery/lib/demo/material/tooltip_demo.dart
View file @
75b24070
...
...
@@ -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:
<
Widget
>[
MaterialDemoDocumentationButton
(
routeName
)],
),
body:
Builder
(
builder:
(
BuildContext
context
)
{
...
...
examples/flutter_gallery/lib/demo/material/two_level_list_demo.dart
View file @
75b24070
...
...
@@ -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:
<
Widget
>[
MaterialDemoDocumentationButton
(
routeName
)],
),
body:
ListView
(
children:
<
Widget
>[
const
ListTile
(
title:
Text
(
'Top'
)),
...
...
examples/flutter_gallery/lib/gallery/demo.dart
View file @
75b24070
...
...
@@ -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
??
<
Widget
>[])..
addAll
(
<
Widget
>[
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<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
)
);
}
}
examples/flutter_gallery/lib/gallery/demos.dart
View file @
75b24070
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment