Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
// Copyright 2018 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:flutter/material.dart';
import 'package:meta/meta.dart';
import 'unit.dart';
const _padding = EdgeInsets.all(16.0);
/// [ConverterRoute] where users can input amounts to convert in one [Unit]
/// and retrieve the conversion in another [Unit] for a specific [Category].
///
/// While it is named ConverterRoute, a more apt name would be ConverterScreen,
/// because it is responsible for the UI at the route's destination.
class ConverterRoute extends StatefulWidget {
/// This [Category]'s name.
final String name;
/// Color for this [Category].
final Color color;
/// Units for this [Category].
final List<Unit> units;
/// This [ConverterRoute] requires the name, color, and units to not be null.
const ConverterRoute({
@required this.name,
@required this.color,
@required this.units,
}) : assert(name != null),
assert(color != null),
assert(units != null);
@override
_ConverterRouteState createState() => _ConverterRouteState();
}
class _ConverterRouteState extends State<ConverterRoute> {
// TODO: Set some variables, such as for keeping track of the user's input
// value and units
List<DropdownMenuItem<Unit>> unitsDropDownItems = List();
Unit fromUnit; // unit di partenza
Unit toUnit; // unit d'arrivo
double inputValue; // valore immesso
String covertedValue; // valore convertito
@override
void initState() {
for (var u in widget.units){
unitsDropDownItems.add(DropdownMenuItem(
child: Text(u.name),
value: u,
));
super.initState();
}
fromUnit = widget.units[0];
toUnit = widget.units[1];
} // TODO: Determine whether you need to override anything, such as initState()
// TODO: Add other helper functions. We've given you one, _format()
/// Clean up conversion; trim trailing zeros, e.g. 5.500 -> 5.5, 10.0 -> 10
String _format(double conversion) {
var outputNum = conversion.toStringAsPrecision(7);
if (outputNum.contains('.') && outputNum.endsWith('0')) {
var i = outputNum.length - 1;
while (outputNum[i] == '0') {
i -= 1;
}
outputNum = outputNum.substring(0, i + 1);
}
if (outputNum.endsWith('.')) {
return outputNum.substring(0, outputNum.length - 1);
}
return outputNum;
}
@override
Widget build(BuildContext context) {
// TODO: Create the 'input' group of widgets. This is a Column that
// includes the input value, and 'from' unit [Dropdown].
var input = Padding(
padding: EdgeInsets.all(16) ,
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
TextField(
onChanged: (String text){
setState(() {
inputValue=double.parse(text);
});
},
decoration: InputDecoration(
labelText: "Input" ,
),
keyboardType: TextInputType.number,
),
DropdownButtonHideUnderline(
child: DropdownButton(
items: unitsDropDownItems,
onChanged: (Unit unit) {
setState(() {
fromUnit = unit;
});
},
value: fromUnit,
),
)
],
),
);
// TODO: Create a compare arrows icon.
var arrow = RotatedBox(
child: Icon(Icons.compare_arrows),
quarterTurns: 1,
);
// TODO: Create the 'output' group of widgets. This is a Column that
// includes the output value, and 'to' unit [Dropdown].
var output = Padding(
padding: EdgeInsets.all(16) ,
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
Text(inputValue.toString()),
DropdownButtonHideUnderline(
child: DropdownButton(
items: unitsDropDownItems,
onChanged: (Unit unit) {
setState(() {
toUnit = unit;
});
},
value: toUnit,
),
)
],
),
);
// TODO: Return the input, arrows, and output widgets, wrapped in a Column.
// TODO: Delete the below placeholder code.
return Column(
children: <Widget>[
input,
arrow,
output,
],
);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.