import 'package:fcs/domain/entities/box.dart'; import 'package:fcs/domain/entities/cargo_type.dart'; import 'package:fcs/domain/entities/rate.dart'; import 'package:fcs/helpers/theme.dart'; import 'package:fcs/pages/rates/model/shipment_rate_model.dart'; import 'package:fcs/pages/widgets/display_text.dart'; import 'package:fcs/pages/widgets/input_text.dart'; import 'package:fcs/pages/widgets/length_picker.dart'; import 'package:fcs/pages/widgets/local_text.dart'; import 'package:fcs/pages/widgets/progress.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_icons/flutter_icons.dart'; import 'package:provider/provider.dart'; class ShipmentRatesCal extends StatefulWidget { ShipmentRatesCal(); @override _ShipmentRatesCalState createState() => _ShipmentRatesCalState(); } class _ShipmentRatesCalState extends State { bool _isLoading = false; CargoType _cargoType; TextEditingController _widthController = new TextEditingController(); TextEditingController _heightController = new TextEditingController(); TextEditingController _lengthController = new TextEditingController(); TextEditingController _actualWeightCtl = new TextEditingController(); double _shipmentWeight = 0; double _amount = 0; double _deliveryFee = 0; @override void initState() { super.initState(); //for shipment weight Rate rate = Provider.of(context, listen: false).rate; _lengthController.addListener(_calShipmentWeight); _widthController.addListener(_calShipmentWeight); _heightController.addListener(_calShipmentWeight); _actualWeightCtl.addListener(_calShipmentWeight); _cargoType = rate.defaultCargoType; _lengthController.text = '12'; _widthController.text = '12'; _heightController.text = '12'; _actualWeightCtl.text = "10"; _calShipmentWeight(); } _calShipmentWeight() { Rate rate = Provider.of(context, listen: false).rate; double l = double.parse(_lengthController.text, (s) => 0); double w = double.parse(_widthController.text, (s) => 0); double h = double.parse(_heightController.text, (s) => 0); _cargoType.weight = double.tryParse(_actualWeightCtl.text) ?? 0; Box box = Box(cargoTypes: [_cargoType], length: l, width: w, height: h); var amount = box.calAmount(rate); var shipmentWeight = box.getShipmentWeight(rate.volumetricRatio); var effectiveWeight = _cargoType.weight > shipmentWeight ? _cargoType.weight : shipmentWeight; setState(() { _deliveryFee = effectiveWeight > rate.freeDeliveryWeight ? 0 : rate.deliveryFee; _amount = amount == null ? 0 : amount + _deliveryFee; _shipmentWeight = shipmentWeight; }); } @override void dispose() { super.dispose(); } @override Widget build(BuildContext context) { var shipmentRateModel = Provider.of(context); final lengthBox = LengthPicker( controller: _lengthController, lableKey: "box.length", ); final widthBox = LengthPicker( controller: _widthController, lableKey: "box.width", ); final heightBox = LengthPicker( controller: _heightController, lableKey: "box.height", ); final dimBox = Row( mainAxisAlignment: MainAxisAlignment.start, children: [ Padding( padding: const EdgeInsets.only(right: 8.0), child: Icon(FontAwesome.arrow_circle_right, color: primaryColor), ), SizedBox(child: lengthBox, width: 80), SizedBox(child: widthBox, width: 80), SizedBox(child: heightBox, width: 80), ], ); final shipmentWeightBox = DisplayText( text: _shipmentWeight != null ? _shipmentWeight.toStringAsFixed(2) : "0", labelTextKey: "box.shipment_weight", iconData: MaterialCommunityIcons.weight, ); final actualWeightBox = InputText( controller: _actualWeightCtl, labelTextKey: "box.actual_weight", iconData: MaterialCommunityIcons.weight, textInputType: TextInputType.number, ); return LocalProgress( inAsyncCall: _isLoading, child: Scaffold( appBar: AppBar( centerTitle: true, leading: new IconButton( icon: new Icon(CupertinoIcons.back, color: primaryColor), onPressed: () => Navigator.of(context).pop(), ), backgroundColor: Colors.white, shadowColor: Colors.transparent, title: LocalText(context, 'rate.cal.title', color: primaryColor, fontSize: 20), ), body: Padding( padding: const EdgeInsets.all(8.0), child: ListView( children: [ Container( padding: EdgeInsets.only(top: 5, left: 25), child: Row( children: [ Expanded( child: LocalText(context, 'rate.cargo.type', color: Colors.grey, fontSize: 15)), Container( width: 150.0, child: DropdownButtonFormField( value: _cargoType, decoration: InputDecoration( fillColor: Colors.white, hintText: shipmentRateModel.rate.cargoTypes[0].name, hintStyle: TextStyle(color: Colors.black87)), items: shipmentRateModel.rate.cargoTypes .map((e) => DropdownMenuItem(child: Text(e.name), value: e)) .toList(), onChanged: (selected) => { setState(() { _cargoType = selected; _calShipmentWeight(); }) }, ), ), ], ), ), actualWeightBox, // LocalTitle(textKey: "box.dimension"), dimBox, shipmentWeightBox, SizedBox(height: 50), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ LocalText(context, "rate.delivery_fee", color: primaryColor, fontSize: 16), Text( ':\$ $_deliveryFee', style: TextStyle( color: primaryColor, fontSize: 16, ), ) ], ), SizedBox(height: 20), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ LocalText(context, "rate.total_estimated_amount", color: primaryColor, fontSize: 16), Text( ':\$${_amount.toStringAsFixed(2)}', style: TextStyle( color: primaryColor, fontSize: 16, ), ) ], ) ], ), ), ), ); } _row(String desc, String price, String unit, String value, {bool input}) { return Container( padding: EdgeInsets.only(left: 25, top: 5, bottom: 5), child: Row( children: [ Text('$desc ', style: TextStyle(fontSize: 15)), Spacer(), Column( crossAxisAlignment: CrossAxisAlignment.end, children: [ Padding( padding: const EdgeInsets.only(bottom: 3.0), child: Text( '$price', style: TextStyle(color: primaryColor, fontSize: 14), ), ), Text( '$unit', style: TextStyle(color: Colors.grey, fontSize: 14), ), // TextFormField(), ], ), SizedBox( width: 50, ), Container( width: 50, child: TextFormField( initialValue: value, textAlign: TextAlign.end, )), ], )); } }