mirror of
https://github.com/flutter/flutter.git
synced 2025-06-03 00:51:18 +00:00

(These are changes cherry-picked from in-flight branches since they are more independent and could be helpful even without those changes.) - Change RouteBuilder's signature to take a single argument in which the other fields are placed, so that we can keep iterating on those arguments without having to break compatibility each time. Also, this makes defining route builders much simpler (only one argument to ignore rather than a variable number). - Expose the next performance to RouteBuilders, since sometimes the route itself might not be where it's used. - Allow BuildContext to be used to walk children, just like it can for ancestors - Allow BuildContext to be used to get the Widget of the current BuildContext - Allow StatefulComponentElement to be referenced with a type specialisation so that you don't have to cast when you know what the type you're dealing with actually is.
108 lines
3.1 KiB
Dart
108 lines
3.1 KiB
Dart
// Copyright 2015 The Chromium Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
import 'package:sky/material.dart';
|
|
import 'package:sky/widgets.dart';
|
|
|
|
class Field extends StatelessComponent {
|
|
Field({
|
|
Key key,
|
|
this.inputKey,
|
|
this.icon,
|
|
this.placeholder
|
|
}) : super(key: key);
|
|
|
|
final GlobalKey inputKey;
|
|
final String icon;
|
|
final String placeholder;
|
|
|
|
Widget build(BuildContext context) {
|
|
return new Row([
|
|
new Padding(
|
|
padding: const EdgeDims.symmetric(horizontal: 16.0),
|
|
child: new Icon(type: icon, size: 24)
|
|
),
|
|
new Flexible(
|
|
child: new Input(
|
|
key: inputKey,
|
|
placeholder: placeholder
|
|
)
|
|
)
|
|
]
|
|
);
|
|
}
|
|
}
|
|
|
|
class AddressBookHome extends StatelessComponent {
|
|
AddressBookHome({ this.navigator });
|
|
|
|
final NavigatorState navigator;
|
|
|
|
Widget buildToolBar(BuildContext context) {
|
|
return new ToolBar(
|
|
left: new IconButton(icon: "navigation/arrow_back"),
|
|
right: [new IconButton(icon: "navigation/check")]
|
|
);
|
|
}
|
|
|
|
Widget buildFloatingActionButton(BuildContext context) {
|
|
return new FloatingActionButton(
|
|
child: new Icon(type: 'image/photo_camera', size: 24),
|
|
backgroundColor: Theme.of(context).accentColor
|
|
);
|
|
}
|
|
|
|
static final GlobalKey nameKey = new GlobalKey();
|
|
static final GlobalKey phoneKey = new GlobalKey();
|
|
static final GlobalKey emailKey = new GlobalKey();
|
|
static final GlobalKey addressKey = new GlobalKey();
|
|
static final GlobalKey ringtoneKey = new GlobalKey();
|
|
static final GlobalKey noteKey = new GlobalKey();
|
|
static final GlobalKey fillKey = new GlobalKey();
|
|
static final GlobalKey emoticonKey = new GlobalKey();
|
|
|
|
Widget buildBody(BuildContext context) {
|
|
return new Material(
|
|
child: new Block([
|
|
new AspectRatio(
|
|
aspectRatio: 16.0 / 9.0,
|
|
child: new Container(
|
|
decoration: new BoxDecoration(backgroundColor: Colors.purple[300])
|
|
)
|
|
),
|
|
new Field(inputKey: nameKey, icon: "social/person", placeholder: "Name"),
|
|
new Field(inputKey: phoneKey, icon: "communication/phone", placeholder: "Phone"),
|
|
new Field(inputKey: emailKey, icon: "communication/email", placeholder: "Email"),
|
|
new Field(inputKey: addressKey, icon: "maps/place", placeholder: "Address"),
|
|
new Field(inputKey: ringtoneKey, icon: "av/volume_up", placeholder: "Ringtone"),
|
|
new Field(inputKey: noteKey, icon: "content/add", placeholder: "Add note"),
|
|
])
|
|
);
|
|
}
|
|
|
|
Widget build(BuildContext context) {
|
|
return new Scaffold(
|
|
toolbar: buildToolBar(context),
|
|
body: buildBody(context),
|
|
floatingActionButton: buildFloatingActionButton(context)
|
|
);
|
|
}
|
|
}
|
|
|
|
final ThemeData theme = new ThemeData(
|
|
brightness: ThemeBrightness.light,
|
|
primarySwatch: Colors.teal,
|
|
accentColor: Colors.pinkAccent[100]
|
|
);
|
|
|
|
void main() {
|
|
runApp(new App(
|
|
title: 'Address Book',
|
|
theme: theme,
|
|
routes: <String, RouteBuilder>{
|
|
'/': (RouteArguments args) => new AddressBookHome(navigator: args.navigator)
|
|
}
|
|
));
|
|
}
|