From 30bdf58568a0158dc30303e98a9a90e90f5cac17 Mon Sep 17 00:00:00 2001 From: Jonathan Bayless Date: Sun, 26 Jan 2020 14:27:56 -0500 Subject: [PATCH 1/3] change car selection to toggle for < 4 --- lib/screens/add_edit/refueling.dart | 79 ++++++++++++++++++++++++++--- lib/screens/home/screen.dart | 1 + 2 files changed, 73 insertions(+), 7 deletions(-) diff --git a/lib/screens/add_edit/refueling.dart b/lib/screens/add_edit/refueling.dart index 8044469b..6bc267e3 100644 --- a/lib/screens/add_edit/refueling.dart +++ b/lib/screens/add_edit/refueling.dart @@ -229,15 +229,67 @@ class _DateFormState extends State<_DateForm> { ]); } +class _CarToggleForm extends StatefulWidget { + final List initialState; + final List cars; + final Function onSaved; + + _CarToggleForm(this.initialState, this.cars, this.onSaved); + + @override + _CarToggleFormState createState() => _CarToggleFormState(initialState, cars, onSaved); +} + +class _CarToggleFormState extends State<_CarToggleForm> { + List isSelected; + final List cars; + final Function onSaved; + + _CarToggleFormState(this.isSelected, this.cars, this.onSaved); + + @override + build(context) => FormField( + builder: (state) => Center( + child: ToggleButtons( + children: cars.map((c) => Text(c.name)).toList(), + onPressed: (int index) { + setState(() { + for (int buttonIndex = 0; buttonIndex < isSelected.length; buttonIndex++) { + if (buttonIndex == index) { + isSelected[buttonIndex] = true; + } else { + isSelected[buttonIndex] = false; + } + } + }); + }, + isSelected: isSelected, + // Constraints are per the Material spec + constraints: BoxConstraints(minWidth: 88, minHeight: 36), + textStyle: Theme.of(context).primaryTextTheme.button, + color: Theme.of(context).primaryTextTheme.button.color.withOpacity(0.7), + selectedColor: Theme.of(context).accentTextTheme.button.color, + fillColor: Theme.of(context).primaryColor, + borderWidth: 2.0, + borderRadius: BorderRadius.circular(5), + ), + ), + onSaved: (_) => onSaved(isSelected), + validator: (_) => null, + ); +} + class RefuelingAddEditScreen extends StatefulWidget { final bool isEditing; final _OnSaveCallback onSave; final Refueling refueling; + final List cars; RefuelingAddEditScreen({ Key key = const ValueKey('__add_edit_refueling__'), @required this.onSave, @required this.isEditing, + @required this.cars, this.refueling, }) : super(key: key); @@ -276,6 +328,11 @@ class _RefuelingAddEditScreenState extends State { _costNode.dispose(); super.dispose(); } + + List _carsToInitialState() => + (widget.cars.map((c) => c.name).contains(widget.refueling?.carName)) ? + widget.cars.map((c) => c.name == widget.refueling?.carName) : + List.generate(widget.cars.length, (idx) => (idx == 0) ? true : false); @override build(context) => Scaffold( @@ -292,18 +349,26 @@ class _RefuelingAddEditScreenState extends State { padding: EdgeInsets.all(15), child: ListView( children: [ - _MileageForm( - refueling: widget.refueling, - onSaved: (val) => _mileage = int.parse(val), - node: _mileageNode, - nextNode: _carNode), - Padding(padding: EdgeInsets.fromLTRB(0, 16, 0, 16)), - CarForm( + (widget.cars.length <= 1) + ? Container() : (widget.cars.length < 4) ? + _CarToggleForm( + _carsToInitialState(), + widget.cars, + (List isSelected) => _car = widget.cars[isSelected.indexWhere((i) => i)].name, + ) + : CarForm( key: ValueKey('__refueling_car_form__'), initialValue: widget.refueling?.carName, onSaved: (val) => _car = val, node: _carNode, nextNode: _amountNode), + (widget.cars.length <= 1) + ? Container() : Padding(padding: EdgeInsets.fromLTRB(0, 16, 0, 16)), + _MileageForm( + refueling: widget.refueling, + onSaved: (val) => _mileage = int.parse(val), + node: _mileageNode, + nextNode: _carNode), Padding(padding: EdgeInsets.fromLTRB(0, 16, 0, 16)), _AmountForm( refueling: widget.refueling, diff --git a/lib/screens/home/screen.dart b/lib/screens/home/screen.dart index 665f8887..d8dc2b27 100644 --- a/lib/screens/home/screen.dart +++ b/lib/screens/home/screen.dart @@ -76,6 +76,7 @@ class _HomeScreenState extends State { carName: n, ))); }, + cars: (BlocProvider.of(context).state as CarsLoaded).cars )), ), MaterialPageRoute( From d5a72d5530046f90ce99e07b81bc3b674fec7606 Mon Sep 17 00:00:00 2001 From: Jonathan Bayless Date: Sun, 26 Jan 2020 14:31:59 -0500 Subject: [PATCH 2/3] fix issues with refueling date selector --- lib/screens/add_edit/refueling.dart | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/lib/screens/add_edit/refueling.dart b/lib/screens/add_edit/refueling.dart index 6bc267e3..5d7e69d4 100644 --- a/lib/screens/add_edit/refueling.dart +++ b/lib/screens/add_edit/refueling.dart @@ -151,7 +151,11 @@ class _DateFormState extends State<_DateForm> { @override initState() { _ctrl = TextEditingController(); - if (initial != null) _ctrl.text = DateFormat.yMd().format(initial); + if (initial != null) { + _ctrl.text = DateFormat.yMd().format(initial); + } else { + _ctrl.text = DateFormat.yMd().format(DateTime.now()); + } super.initState(); } @@ -198,6 +202,11 @@ class _DateFormState extends State<_DateForm> { @override build(context) => Row(children: [ + IconButton( + icon: Icon(Icons.calendar_today), + tooltip: AutodoLocalizations.chooseDate, + onPressed: (() => chooseDate(context, _ctrl.text)), + ), Expanded( child: TextFormField( decoration: InputDecoration( @@ -221,11 +230,6 @@ class _DateFormState extends State<_DateForm> { if (nextNode != null) return changeFocus(node, nextNode); }), ), - IconButton( - icon: Icon(Icons.calendar_today), - tooltip: AutodoLocalizations.chooseDate, - onPressed: (() => chooseDate(context, _ctrl.text)), - ) ]); } From 534debc7301ee1c8809d01f7ea3be92c5ea2a078 Mon Sep 17 00:00:00 2001 From: baylessj Date: Sun, 26 Jan 2020 19:34:17 +0000 Subject: [PATCH 3/3] Apply automatic changes --- lib/screens/add_edit/refueling.dart | 119 +++++++++++++++------------- lib/screens/home/screen.dart | 26 +++--- 2 files changed, 78 insertions(+), 67 deletions(-) diff --git a/lib/screens/add_edit/refueling.dart b/lib/screens/add_edit/refueling.dart index 5d7e69d4..72bf8e2b 100644 --- a/lib/screens/add_edit/refueling.dart +++ b/lib/screens/add_edit/refueling.dart @@ -151,7 +151,7 @@ class _DateFormState extends State<_DateForm> { @override initState() { _ctrl = TextEditingController(); - if (initial != null) { + if (initial != null) { _ctrl.text = DateFormat.yMd().format(initial); } else { _ctrl.text = DateFormat.yMd().format(DateTime.now()); @@ -202,7 +202,7 @@ class _DateFormState extends State<_DateForm> { @override build(context) => Row(children: [ - IconButton( + IconButton( icon: Icon(Icons.calendar_today), tooltip: AutodoLocalizations.chooseDate, onPressed: (() => chooseDate(context, _ctrl.text)), @@ -240,8 +240,9 @@ class _CarToggleForm extends StatefulWidget { _CarToggleForm(this.initialState, this.cars, this.onSaved); - @override - _CarToggleFormState createState() => _CarToggleFormState(initialState, cars, onSaved); + @override + _CarToggleFormState createState() => + _CarToggleFormState(initialState, cars, onSaved); } class _CarToggleFormState extends State<_CarToggleForm> { @@ -251,36 +252,42 @@ class _CarToggleFormState extends State<_CarToggleForm> { _CarToggleFormState(this.isSelected, this.cars, this.onSaved); - @override - build(context) => FormField( - builder: (state) => Center( - child: ToggleButtons( - children: cars.map((c) => Text(c.name)).toList(), - onPressed: (int index) { - setState(() { - for (int buttonIndex = 0; buttonIndex < isSelected.length; buttonIndex++) { - if (buttonIndex == index) { - isSelected[buttonIndex] = true; - } else { - isSelected[buttonIndex] = false; - } - } - }); - }, - isSelected: isSelected, - // Constraints are per the Material spec - constraints: BoxConstraints(minWidth: 88, minHeight: 36), - textStyle: Theme.of(context).primaryTextTheme.button, - color: Theme.of(context).primaryTextTheme.button.color.withOpacity(0.7), - selectedColor: Theme.of(context).accentTextTheme.button.color, - fillColor: Theme.of(context).primaryColor, - borderWidth: 2.0, - borderRadius: BorderRadius.circular(5), - ), - ), - onSaved: (_) => onSaved(isSelected), - validator: (_) => null, - ); + @override + build(context) => FormField( + builder: (state) => Center( + child: ToggleButtons( + children: cars.map((c) => Text(c.name)).toList(), + onPressed: (int index) { + setState(() { + for (int buttonIndex = 0; + buttonIndex < isSelected.length; + buttonIndex++) { + if (buttonIndex == index) { + isSelected[buttonIndex] = true; + } else { + isSelected[buttonIndex] = false; + } + } + }); + }, + isSelected: isSelected, + // Constraints are per the Material spec + constraints: BoxConstraints(minWidth: 88, minHeight: 36), + textStyle: Theme.of(context).primaryTextTheme.button, + color: Theme.of(context) + .primaryTextTheme + .button + .color + .withOpacity(0.7), + selectedColor: Theme.of(context).accentTextTheme.button.color, + fillColor: Theme.of(context).primaryColor, + borderWidth: 2.0, + borderRadius: BorderRadius.circular(5), + ), + ), + onSaved: (_) => onSaved(isSelected), + validator: (_) => null, + ); } class RefuelingAddEditScreen extends StatefulWidget { @@ -332,11 +339,12 @@ class _RefuelingAddEditScreenState extends State { _costNode.dispose(); super.dispose(); } - - List _carsToInitialState() => - (widget.cars.map((c) => c.name).contains(widget.refueling?.carName)) ? - widget.cars.map((c) => c.name == widget.refueling?.carName) : - List.generate(widget.cars.length, (idx) => (idx == 0) ? true : false); + + List _carsToInitialState() => (widget.cars + .map((c) => c.name) + .contains(widget.refueling?.carName)) + ? widget.cars.map((c) => c.name == widget.refueling?.carName) + : List.generate(widget.cars.length, (idx) => (idx == 0) ? true : false); @override build(context) => Scaffold( @@ -353,21 +361,24 @@ class _RefuelingAddEditScreenState extends State { padding: EdgeInsets.all(15), child: ListView( children: [ - (widget.cars.length <= 1) - ? Container() : (widget.cars.length < 4) ? - _CarToggleForm( - _carsToInitialState(), - widget.cars, - (List isSelected) => _car = widget.cars[isSelected.indexWhere((i) => i)].name, - ) - : CarForm( - key: ValueKey('__refueling_car_form__'), - initialValue: widget.refueling?.carName, - onSaved: (val) => _car = val, - node: _carNode, - nextNode: _amountNode), - (widget.cars.length <= 1) - ? Container() : Padding(padding: EdgeInsets.fromLTRB(0, 16, 0, 16)), + (widget.cars.length <= 1) + ? Container() + : (widget.cars.length < 4) + ? _CarToggleForm( + _carsToInitialState(), + widget.cars, + (List isSelected) => _car = widget + .cars[isSelected.indexWhere((i) => i)].name, + ) + : CarForm( + key: ValueKey('__refueling_car_form__'), + initialValue: widget.refueling?.carName, + onSaved: (val) => _car = val, + node: _carNode, + nextNode: _amountNode), + (widget.cars.length <= 1) + ? Container() + : Padding(padding: EdgeInsets.fromLTRB(0, 16, 0, 16)), _MileageForm( refueling: widget.refueling, onSaved: (val) => _mileage = int.parse(val), diff --git a/lib/screens/home/screen.dart b/lib/screens/home/screen.dart index d8dc2b27..5e7d04a4 100644 --- a/lib/screens/home/screen.dart +++ b/lib/screens/home/screen.dart @@ -65,19 +65,19 @@ class _HomeScreenState extends State { MaterialPageRoute( builder: (context) => _ScreenWithBanner( child: RefuelingAddEditScreen( - isEditing: false, - onSave: (m, d, a, c, n) { - BlocProvider.of(context) - .add(AddRefueling(Refueling( - mileage: m, - date: d, - amount: a, - cost: c, - carName: n, - ))); - }, - cars: (BlocProvider.of(context).state as CarsLoaded).cars - )), + isEditing: false, + onSave: (m, d, a, c, n) { + BlocProvider.of(context) + .add(AddRefueling(Refueling( + mileage: m, + date: d, + amount: a, + cost: c, + carName: n, + ))); + }, + cars: (BlocProvider.of(context).state as CarsLoaded) + .cars)), ), MaterialPageRoute( builder: (context) => _ScreenWithBanner(