Merge pull request #2532 from HansMuller/scaffold
Scaffold saves and restores scrollable state, etc
This commit is contained in:
commit
8f603800ba
@ -14,11 +14,6 @@ enum DialogDemoAction {
|
||||
agree,
|
||||
}
|
||||
|
||||
const String _introText =
|
||||
"Use dialogs sparingly because their sudden appearance forces users to stop their "
|
||||
"current task and focus on the dialog's content. Alternatives to dialogs include "
|
||||
"menus or inline expansion, both of which maintain the current context.";
|
||||
|
||||
const String _alertWithoutTitleText = "Discard draft?";
|
||||
|
||||
const String _alertWithTitleText =
|
||||
@ -88,134 +83,115 @@ class DialogDemoState extends State<DialogDemo> {
|
||||
toolBar: new ToolBar(
|
||||
center: new Text('Dialogs')
|
||||
),
|
||||
body: new ButtonTheme(
|
||||
color: ButtonColor.accent,
|
||||
child: new Padding(
|
||||
padding: const EdgeDims.all(24.0),
|
||||
child: new ScrollableViewport(
|
||||
child: new Column(
|
||||
alignItems: FlexAlignItems.stretch,
|
||||
children: <Widget>[
|
||||
new Container(
|
||||
child: new Text(
|
||||
_introText,
|
||||
body: new Block(
|
||||
padding: const EdgeDims.symmetric(vertical: 24.0, horizontal: 72.0),
|
||||
children: <Widget>[
|
||||
new RaisedButton(
|
||||
child: new Text('ALERT'),
|
||||
onPressed: () {
|
||||
showDemoDialog(
|
||||
context: context,
|
||||
dialog: new Dialog(
|
||||
content: new Text(
|
||||
_alertWithoutTitleText,
|
||||
style: dialogTextStyle
|
||||
),
|
||||
padding: const EdgeDims.only(top: 8.0, bottom: 24.0),
|
||||
margin: const EdgeDims.only(bottom:16.0),
|
||||
decoration: new BoxDecoration(
|
||||
border: new Border(bottom: new BorderSide(color: theme.dividerColor))
|
||||
)
|
||||
),
|
||||
new FlatButton(
|
||||
child: new Text('Alert without a title'),
|
||||
onPressed: () {
|
||||
showDemoDialog(
|
||||
context: context,
|
||||
dialog: new Dialog(
|
||||
content: new Text(
|
||||
_alertWithoutTitleText,
|
||||
style: dialogTextStyle
|
||||
),
|
||||
actions: <Widget>[
|
||||
new FlatButton(
|
||||
child: new Text('CANCEL'),
|
||||
onPressed: () { Navigator.pop(context, DialogDemoAction.cancel); }
|
||||
),
|
||||
new FlatButton(
|
||||
child: new Text('DISCARD'),
|
||||
onPressed: () { Navigator.pop(context, DialogDemoAction.discard); }
|
||||
)
|
||||
]
|
||||
)
|
||||
);
|
||||
}
|
||||
),
|
||||
new FlatButton(
|
||||
child: new Text('Alert with a title'),
|
||||
onPressed: () {
|
||||
showDemoDialog(
|
||||
context: context,
|
||||
dialog: new Dialog(
|
||||
title: new Text("Use Google's location service?"),
|
||||
content: new Text(
|
||||
_alertWithTitleText,
|
||||
style: dialogTextStyle
|
||||
),
|
||||
actions: <Widget>[
|
||||
new FlatButton(
|
||||
child: new Text('DISAGREE'),
|
||||
onPressed: () { Navigator.pop(context, DialogDemoAction.disagree); }
|
||||
),
|
||||
new FlatButton(
|
||||
child: new Text('AGREE'),
|
||||
onPressed: () { Navigator.pop(context, DialogDemoAction.agree); }
|
||||
)
|
||||
]
|
||||
)
|
||||
);
|
||||
}
|
||||
),
|
||||
new FlatButton(
|
||||
child: new Text('Simple Dialog'),
|
||||
onPressed: () {
|
||||
showDemoDialog(
|
||||
context: context,
|
||||
dialog: new Dialog(
|
||||
title: new Text('Set backup account'),
|
||||
content: new Column(
|
||||
children: <Widget>[
|
||||
new DialogDemoItem(
|
||||
icon: Icons.account_circle,
|
||||
color: theme.primaryColor,
|
||||
text: 'username@gmail.com',
|
||||
onPressed: () { Navigator.pop(context, 'username@gmail.com'); }
|
||||
),
|
||||
new DialogDemoItem(
|
||||
icon: Icons.account_circle,
|
||||
color: theme.primaryColor,
|
||||
text: 'user02@gmail.com',
|
||||
onPressed: () { Navigator.pop(context, 'user02@gmail.com'); }
|
||||
),
|
||||
new DialogDemoItem(
|
||||
icon: Icons.add_circle,
|
||||
text: 'add account',
|
||||
color: theme.disabledColor
|
||||
)
|
||||
]
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
),
|
||||
new FlatButton(
|
||||
child: new Text('Confirmation Dialog'),
|
||||
onPressed: () {
|
||||
showTimePicker(
|
||||
context: context,
|
||||
initialTime: const TimeOfDay(hour: 15, minute: 30)
|
||||
actions: <Widget>[
|
||||
new FlatButton(
|
||||
child: new Text('CANCEL'),
|
||||
onPressed: () { Navigator.pop(context, DialogDemoAction.cancel); }
|
||||
),
|
||||
new FlatButton(
|
||||
child: new Text('DISCARD'),
|
||||
onPressed: () { Navigator.pop(context, DialogDemoAction.discard); }
|
||||
)
|
||||
.then((value) { // The value passed to Navigator.pop() or null.
|
||||
if (value != null) {
|
||||
scaffoldKey.currentState.showSnackBar(new SnackBar(
|
||||
content: new Text('You selected: $value')
|
||||
));
|
||||
}
|
||||
});
|
||||
}
|
||||
),
|
||||
new FlatButton(
|
||||
child: new Text('Fullscreen Dialog'),
|
||||
onPressed: () {
|
||||
Navigator.push(context, new MaterialPageRoute(
|
||||
builder: (BuildContext context) => new FullScreenDialogDemo()
|
||||
));
|
||||
}
|
||||
]
|
||||
)
|
||||
]
|
||||
)
|
||||
);
|
||||
}
|
||||
),
|
||||
new RaisedButton(
|
||||
child: new Text('ALERT WITH TITLE'),
|
||||
onPressed: () {
|
||||
showDemoDialog(
|
||||
context: context,
|
||||
dialog: new Dialog(
|
||||
title: new Text("Use Google's location service?"),
|
||||
content: new Text(
|
||||
_alertWithTitleText,
|
||||
style: dialogTextStyle
|
||||
),
|
||||
actions: <Widget>[
|
||||
new FlatButton(
|
||||
child: new Text('DISAGREE'),
|
||||
onPressed: () { Navigator.pop(context, DialogDemoAction.disagree); }
|
||||
),
|
||||
new FlatButton(
|
||||
child: new Text('AGREE'),
|
||||
onPressed: () { Navigator.pop(context, DialogDemoAction.agree); }
|
||||
)
|
||||
]
|
||||
)
|
||||
);
|
||||
}
|
||||
),
|
||||
new RaisedButton(
|
||||
child: new Text('SIMPLE'),
|
||||
onPressed: () {
|
||||
showDemoDialog(
|
||||
context: context,
|
||||
dialog: new Dialog(
|
||||
title: new Text('Set backup account'),
|
||||
content: new Column(
|
||||
children: <Widget>[
|
||||
new DialogDemoItem(
|
||||
icon: Icons.account_circle,
|
||||
color: theme.primaryColor,
|
||||
text: 'username@gmail.com',
|
||||
onPressed: () { Navigator.pop(context, 'username@gmail.com'); }
|
||||
),
|
||||
new DialogDemoItem(
|
||||
icon: Icons.account_circle,
|
||||
color: theme.primaryColor,
|
||||
text: 'user02@gmail.com',
|
||||
onPressed: () { Navigator.pop(context, 'user02@gmail.com'); }
|
||||
),
|
||||
new DialogDemoItem(
|
||||
icon: Icons.add_circle,
|
||||
text: 'add account',
|
||||
color: theme.disabledColor
|
||||
)
|
||||
]
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
),
|
||||
new RaisedButton(
|
||||
child: new Text('CONFIRMATION'),
|
||||
onPressed: () {
|
||||
showTimePicker(
|
||||
context: context,
|
||||
initialTime: const TimeOfDay(hour: 15, minute: 30)
|
||||
)
|
||||
.then((value) { // The value passed to Navigator.pop() or null.
|
||||
if (value != null) {
|
||||
scaffoldKey.currentState.showSnackBar(new SnackBar(
|
||||
content: new Text('You selected: $value')
|
||||
));
|
||||
}
|
||||
});
|
||||
}
|
||||
),
|
||||
new RaisedButton(
|
||||
child: new Text('FULLSCREEN'),
|
||||
onPressed: () {
|
||||
Navigator.push(context, new MaterialPageRoute(
|
||||
builder: (BuildContext context) => new FullScreenDialogDemo()
|
||||
));
|
||||
}
|
||||
)
|
||||
)
|
||||
]
|
||||
)
|
||||
);
|
||||
}
|
||||
|
@ -5,17 +5,6 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class PageSelectorDemo extends StatelessComponent {
|
||||
Widget _buildTabView(IconData icon) {
|
||||
return new Container(
|
||||
key: new ObjectKey(icon),
|
||||
padding: const EdgeDims.all(12.0),
|
||||
child: new Card(
|
||||
child: new Center(
|
||||
child: new Icon(icon: icon, size: 48.0)
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
void _handleArrowButtonPress(BuildContext context, int delta) {
|
||||
final TabBarSelectionState selection = TabBarSelection.of(context);
|
||||
@ -35,10 +24,11 @@ class PageSelectorDemo extends StatelessComponent {
|
||||
|
||||
return new Scaffold(
|
||||
toolBar: new ToolBar(center: new Text('Page Selector')),
|
||||
body: new TabBarSelection(
|
||||
body: new TabBarSelection<IconData>(
|
||||
values: icons,
|
||||
child: new Builder(
|
||||
builder: (BuildContext context) {
|
||||
final Color color = Theme.of(context).accentColor;
|
||||
return new Column(
|
||||
children: <Widget>[
|
||||
new Container(
|
||||
@ -47,12 +37,14 @@ class PageSelectorDemo extends StatelessComponent {
|
||||
children: <Widget>[
|
||||
new IconButton(
|
||||
icon: Icons.arrow_back,
|
||||
color: color,
|
||||
onPressed: () { _handleArrowButtonPress(context, -1); },
|
||||
tooltip: 'Back'
|
||||
),
|
||||
new TabPageSelector<String>(),
|
||||
new TabPageSelector<IconData>(),
|
||||
new IconButton(
|
||||
icon: Icons.arrow_forward,
|
||||
color: color,
|
||||
onPressed: () { _handleArrowButtonPress(context, 1); },
|
||||
tooltip: 'Forward'
|
||||
)
|
||||
@ -62,7 +54,18 @@ class PageSelectorDemo extends StatelessComponent {
|
||||
),
|
||||
new Flexible(
|
||||
child: new TabBarView(
|
||||
children: icons.map(_buildTabView).toList()
|
||||
children: icons.map((IconData icon) {
|
||||
return new Container(
|
||||
key: new ObjectKey(icon),
|
||||
padding: const EdgeDims.all(12.0),
|
||||
child: new Card(
|
||||
child: new Center(
|
||||
child: new Icon(icon: icon, size: 128.0, color: color)
|
||||
)
|
||||
)
|
||||
);
|
||||
})
|
||||
.toList()
|
||||
)
|
||||
)
|
||||
]
|
||||
|
@ -23,7 +23,8 @@ class TabsDemo extends StatelessComponent {
|
||||
Icons.language: 'LANGUAGE',
|
||||
};
|
||||
|
||||
Widget build(_) {
|
||||
Widget build(BuildContext context) {
|
||||
final Color iconColor = Theme.of(context).accentColor;
|
||||
return new TabBarSelection(
|
||||
values: icons,
|
||||
child: new Scaffold(
|
||||
@ -43,7 +44,13 @@ class TabsDemo extends StatelessComponent {
|
||||
key: new ObjectKey(icon),
|
||||
padding: const EdgeDims.all(12.0),
|
||||
child: new Card(
|
||||
child: new Center(child: new Icon(icon: icon, size: 48.0))
|
||||
child: new Center(
|
||||
child: new Icon(
|
||||
icon: icon,
|
||||
color: iconColor,
|
||||
size: 128.0
|
||||
)
|
||||
)
|
||||
)
|
||||
);
|
||||
}).toList()
|
||||
|
@ -345,6 +345,12 @@ class ScaffoldState extends State<Scaffold> {
|
||||
void initState() {
|
||||
super.initState();
|
||||
_appBarController = new AnimationController();
|
||||
List<double> scrollValues = PageStorage.of(context)?.readState(context);
|
||||
if (scrollValues != null) {
|
||||
assert(scrollValues.length == 2);
|
||||
_scrollOffset = scrollValues[0];
|
||||
_scrollOffsetDelta = scrollValues[1];
|
||||
}
|
||||
}
|
||||
|
||||
void dispose() {
|
||||
@ -353,6 +359,7 @@ class ScaffoldState extends State<Scaffold> {
|
||||
_snackBarController = null;
|
||||
_snackBarTimer?.cancel();
|
||||
_snackBarTimer = null;
|
||||
PageStorage.of(context)?.writeState(context, <double>[_scrollOffset, _scrollOffsetDelta]);
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
|
@ -999,7 +999,7 @@ class TabPageSelector<T> extends StatelessComponent {
|
||||
|
||||
Widget build(BuildContext context) {
|
||||
final TabBarSelectionState selection = TabBarSelection.of(context);
|
||||
final Color color = Theme.of(context).primaryColor;
|
||||
final Color color = Theme.of(context).accentColor;
|
||||
final ColorTween selectedColor = new ColorTween(begin: Colors.transparent, end: color);
|
||||
final ColorTween previousColor = new ColorTween(begin: color, end: Colors.transparent);
|
||||
Animation<double> animation = new CurvedAnimation(parent: selection.animation, curve: Curves.ease);
|
||||
|
Loading…
x
Reference in New Issue
Block a user