
To make it easier to avoid pushing twice in one frame, provide a transaction mechanism for the navigator.
155 lines
4.1 KiB
Dart
155 lines
4.1 KiB
Dart
// Copyright 2014 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.
|
|
|
|
part of fitness;
|
|
|
|
class Measurement extends FitnessItem {
|
|
Measurement({ DateTime when, this.weight }) : super(when: when);
|
|
Measurement.fromJson(Map json) : weight = json['weight'], super.fromJson(json);
|
|
|
|
final double weight;
|
|
|
|
// TODO(jackson): Internationalize
|
|
String get displayWeight => "${weight.toStringAsFixed(1)} lbs";
|
|
|
|
@override
|
|
Map toJson() {
|
|
Map json = super.toJson();
|
|
json['weight'] = weight;
|
|
json['type'] = runtimeType.toString();
|
|
return json;
|
|
}
|
|
|
|
FitnessItemRow toRow({ FitnessItemHandler onDismissed }) {
|
|
return new MeasurementRow(measurement: this, onDismissed: onDismissed);
|
|
}
|
|
}
|
|
|
|
class MeasurementRow extends FitnessItemRow {
|
|
MeasurementRow({ Measurement measurement, FitnessItemHandler onDismissed })
|
|
: super(item: measurement, onDismissed: onDismissed);
|
|
|
|
Widget buildContent(BuildContext context) {
|
|
Measurement measurement = item;
|
|
List<Widget> children = <Widget>[
|
|
new Flexible(
|
|
child: new Text(
|
|
measurement.displayWeight,
|
|
style: Theme.of(context).text.subhead
|
|
)
|
|
),
|
|
new Flexible(
|
|
child: new Text(
|
|
measurement.displayDate,
|
|
style: Theme.of(context).text.caption.copyWith(textAlign: TextAlign.right)
|
|
)
|
|
)
|
|
];
|
|
return new Row(
|
|
children,
|
|
alignItems: FlexAlignItems.baseline,
|
|
textBaseline: DefaultTextStyle.of(context).textBaseline
|
|
);
|
|
}
|
|
}
|
|
|
|
class MeasurementFragment extends StatefulComponent {
|
|
MeasurementFragment({ this.onCreated });
|
|
|
|
final FitnessItemHandler onCreated;
|
|
|
|
MeasurementFragmentState createState() => new MeasurementFragmentState();
|
|
}
|
|
|
|
class MeasurementFragmentState extends State<MeasurementFragment> {
|
|
String _weight = "";
|
|
DateTime _when = new DateTime.now();
|
|
|
|
void _handleSave() {
|
|
double parsedWeight;
|
|
try {
|
|
parsedWeight = double.parse(_weight);
|
|
} on FormatException catch(e) {
|
|
print("Exception $e");
|
|
Scaffold.of(context).showSnackBar(new SnackBar(
|
|
content: new Text('Save failed')
|
|
));
|
|
}
|
|
config.onCreated(new Measurement(when: _when, weight: parsedWeight));
|
|
Navigator.pop(context);
|
|
}
|
|
|
|
Widget buildToolBar() {
|
|
return new ToolBar(
|
|
left: new IconButton(
|
|
icon: "navigation/close",
|
|
onPressed: () => Navigator.pop(context)
|
|
),
|
|
center: new Text('New Measurement'),
|
|
right: <Widget>[
|
|
// TODO(abarth): Should this be a FlatButton?
|
|
new InkWell(
|
|
onTap: _handleSave,
|
|
child: new Text('SAVE')
|
|
)
|
|
]
|
|
);
|
|
}
|
|
|
|
void _handleWeightChanged(String weight) {
|
|
setState(() {
|
|
_weight = weight;
|
|
});
|
|
}
|
|
|
|
static final GlobalKey weightKey = new GlobalKey();
|
|
|
|
Future _handleDatePressed() async {
|
|
DateTime value = await showDatePicker(
|
|
context: context,
|
|
initialDate: _when,
|
|
firstDate: new DateTime(2015, 8),
|
|
lastDate: new DateTime(2101)
|
|
);
|
|
if (value != _when) {
|
|
setState(() {
|
|
_when = value;
|
|
});
|
|
}
|
|
}
|
|
|
|
Widget buildBody(BuildContext context) {
|
|
Measurement measurement = new Measurement(when: _when);
|
|
// TODO(jackson): Revisit the layout of this pane to be more maintainable
|
|
return new Container(
|
|
padding: const EdgeDims.all(20.0),
|
|
child: new Column(<Widget>[
|
|
new GestureDetector(
|
|
onTap: _handleDatePressed,
|
|
child: new Container(
|
|
height: 50.0,
|
|
child: new Column(<Widget>[
|
|
new Text('Measurement Date'),
|
|
new Text(measurement.displayDate, style: Theme.of(context).text.caption),
|
|
], alignItems: FlexAlignItems.start)
|
|
)
|
|
),
|
|
new Input(
|
|
key: weightKey,
|
|
placeholder: 'Enter weight',
|
|
keyboardType: KeyboardType.NUMBER,
|
|
onChanged: _handleWeightChanged
|
|
),
|
|
], alignItems: FlexAlignItems.stretch)
|
|
);
|
|
}
|
|
|
|
Widget build(BuildContext context) {
|
|
return new Scaffold(
|
|
toolBar: buildToolBar(),
|
|
body: buildBody(context)
|
|
);
|
|
}
|
|
}
|