|
|
|
|
|
|
|
|
|
|
|
import 'dart:convert'; |
|
|
|
|
|
|
|
|
|
|
|
import 'package:farm_tpf/custom_model/Harvest.dart'; |
|
|
|
|
|
import 'package:farm_tpf/custom_model/Sell.dart'; |
|
|
|
|
|
import 'package:farm_tpf/data/api/app_exception.dart'; |
|
|
|
|
|
import 'package:farm_tpf/data/repository/repository.dart'; |
|
|
|
|
|
import 'package:farm_tpf/presentation/custom_widgets/bloc/media_helper_bloc.dart'; |
|
|
|
|
|
import 'package:farm_tpf/presentation/custom_widgets/widget_loading.dart'; |
|
|
|
|
|
import 'package:farm_tpf/presentation/custom_widgets/widget_media_picker.dart'; |
|
|
|
|
|
import 'package:farm_tpf/presentation/screens/actions/bloc/action_detail_bloc.dart'; |
|
|
|
|
|
import 'package:farm_tpf/presentation/screens/actions/state_management_helper/change_file_controller.dart'; |
|
|
|
|
|
import 'package:farm_tpf/utils/const_common.dart'; |
|
|
import 'package:farm_tpf/utils/const_string.dart'; |
|
|
import 'package:farm_tpf/utils/const_string.dart'; |
|
|
|
|
|
import 'package:farm_tpf/utils/const_style.dart'; |
|
|
|
|
|
import 'package:farm_tpf/utils/validators.dart'; |
|
|
import 'package:flutter/material.dart'; |
|
|
import 'package:flutter/material.dart'; |
|
|
|
|
|
import 'package:flutter_bloc/flutter_bloc.dart'; |
|
|
|
|
|
import 'package:flutter_datetime_picker/flutter_datetime_picker.dart'; |
|
|
|
|
|
import 'package:get/get.dart'; |
|
|
|
|
|
import 'package:intl/intl.dart'; |
|
|
|
|
|
import 'package:keyboard_dismisser/keyboard_dismisser.dart'; |
|
|
|
|
|
import 'package:pattern_formatter/pattern_formatter.dart'; |
|
|
|
|
|
import 'package:farm_tpf/utils/formatter.dart'; |
|
|
|
|
|
|
|
|
|
|
|
import '../bloc_get_harvest.dart'; |
|
|
|
|
|
import '../util_action.dart'; |
|
|
|
|
|
|
|
|
class EditActionSellScreen extends StatefulWidget { |
|
|
class EditActionSellScreen extends StatefulWidget { |
|
|
|
|
|
final int cropId; |
|
|
|
|
|
final bool isEdit; |
|
|
|
|
|
final int activityId; |
|
|
|
|
|
final int harvestId; |
|
|
|
|
|
EditActionSellScreen( |
|
|
|
|
|
{@required this.cropId, |
|
|
|
|
|
this.isEdit = false, |
|
|
|
|
|
this.activityId, |
|
|
|
|
|
this.harvestId}); |
|
|
@override |
|
|
@override |
|
|
_EditActionSellScreenState createState() => _EditActionSellScreenState(); |
|
|
_EditActionSellScreenState createState() => _EditActionSellScreenState(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
class _EditActionSellScreenState extends State<EditActionSellScreen> { |
|
|
class _EditActionSellScreenState extends State<EditActionSellScreen> { |
|
|
|
|
|
final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>(); |
|
|
|
|
|
final _repository = Repository(); |
|
|
|
|
|
GlobalKey<FormState> _formKey = GlobalKey(); |
|
|
|
|
|
bool _autoValidate = false; |
|
|
|
|
|
Sell _sell = Sell(); |
|
|
|
|
|
TextEditingController _l1Controller = TextEditingController(); |
|
|
|
|
|
TextEditingController _l2Controller = TextEditingController(); |
|
|
|
|
|
TextEditingController _l3Controller = TextEditingController(); |
|
|
|
|
|
TextEditingController _removedQuantityController = TextEditingController(); |
|
|
|
|
|
TextEditingController _descriptionController = TextEditingController(); |
|
|
|
|
|
final _buyerController = TextEditingController(); |
|
|
|
|
|
|
|
|
|
|
|
List<Harvest> _harvests = List<Harvest>(); |
|
|
|
|
|
Harvest harvestValue; |
|
|
|
|
|
String executeTimeView; |
|
|
|
|
|
DateTime executeTime = DateTime.now(); |
|
|
|
|
|
List<String> filePaths = List<String>(); |
|
|
|
|
|
var changeFileController = Get.put(ChangeFileController()); |
|
|
|
|
|
|
|
|
@override |
|
|
@override |
|
|
Widget build(BuildContext context) { |
|
|
|
|
|
return Scaffold( |
|
|
|
|
|
appBar: AppBar( |
|
|
|
|
|
title: Text(plot_action_sell), |
|
|
|
|
|
), |
|
|
|
|
|
|
|
|
void initState() { |
|
|
|
|
|
super.initState(); |
|
|
|
|
|
changeFileController.initValue(); |
|
|
|
|
|
var parsedExecuteDate = |
|
|
|
|
|
DateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").format(executeTime); |
|
|
|
|
|
_sell.executeDate = "$parsedExecuteDate"; |
|
|
|
|
|
executeTimeView = DateFormat("dd/MM/yyyy HH:mm").format(executeTime); |
|
|
|
|
|
_sell.cropId = widget.cropId; |
|
|
|
|
|
|
|
|
|
|
|
if (!widget.isEdit) { |
|
|
|
|
|
getHarvestBloc.getHarvests((data) { |
|
|
|
|
|
_harvests = data; |
|
|
|
|
|
for (var item in _harvests) { |
|
|
|
|
|
if (item.id == widget.harvestId) { |
|
|
|
|
|
harvestValue = item; |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
}, (err) {}); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
_validateInputs() async { |
|
|
|
|
|
if (_formKey.currentState.validate()) { |
|
|
|
|
|
_formKey.currentState.save(); |
|
|
|
|
|
LoadingDialog.showLoadingDialog(context); |
|
|
|
|
|
filePaths = Get.find<ChangeFileController>().files; |
|
|
|
|
|
try { |
|
|
|
|
|
var activitySell = jsonEncode(_sell.toJson()).toString(); |
|
|
|
|
|
//ADD NEW |
|
|
|
|
|
if (_sell.activityId == null) { |
|
|
|
|
|
_repository.createAction((value) { |
|
|
|
|
|
LoadingDialog.hideLoadingDialog(context); |
|
|
|
|
|
Get.back(result: value); |
|
|
|
|
|
Get.snackbar(label_add_success, "Hoạt động xuất bán", |
|
|
|
|
|
snackPosition: SnackPosition.BOTTOM); |
|
|
|
|
|
}, (error) { |
|
|
|
|
|
LoadingDialog.hideLoadingDialog(context); |
|
|
|
|
|
_scaffoldKey.currentState.showSnackBar(SnackBar( |
|
|
|
|
|
content: Row( |
|
|
|
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween, |
|
|
|
|
|
children: <Widget>[ |
|
|
|
|
|
Flexible(child: Text(AppException.handleError(error))), |
|
|
|
|
|
Icon(Icons.error), |
|
|
|
|
|
], |
|
|
|
|
|
), |
|
|
|
|
|
backgroundColor: Colors.red, |
|
|
|
|
|
duration: Duration(seconds: 3), |
|
|
|
|
|
)); |
|
|
|
|
|
}, |
|
|
|
|
|
apiAddAction: ConstCommon.apiAddSell, |
|
|
|
|
|
paramActivity: ConstCommon.paramsActionSell, |
|
|
|
|
|
activityAction: activitySell, |
|
|
|
|
|
filePaths: filePaths); |
|
|
|
|
|
} else { |
|
|
|
|
|
//UPDATE |
|
|
|
|
|
_repository.updateAction((value) { |
|
|
|
|
|
LoadingDialog.hideLoadingDialog(context); |
|
|
|
|
|
Get.back(result: value); |
|
|
|
|
|
Get.snackbar(label_update_success, "Hoạt động xuất bán", |
|
|
|
|
|
snackPosition: SnackPosition.BOTTOM); |
|
|
|
|
|
}, (error) { |
|
|
|
|
|
LoadingDialog.hideLoadingDialog(context); |
|
|
|
|
|
_scaffoldKey.currentState.showSnackBar(SnackBar( |
|
|
|
|
|
content: Row( |
|
|
|
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween, |
|
|
|
|
|
children: <Widget>[ |
|
|
|
|
|
Flexible(child: Text(AppException.handleError(error))), |
|
|
|
|
|
Icon(Icons.error), |
|
|
|
|
|
], |
|
|
|
|
|
), |
|
|
|
|
|
backgroundColor: Colors.red, |
|
|
|
|
|
duration: Duration(seconds: 3), |
|
|
|
|
|
)); |
|
|
|
|
|
}, |
|
|
|
|
|
apiUpdateAction: ConstCommon.apiUpdateSell, |
|
|
|
|
|
paramActivity: ConstCommon.paramsActionSell, |
|
|
|
|
|
activityAction: activitySell, |
|
|
|
|
|
filePaths: filePaths); |
|
|
|
|
|
} |
|
|
|
|
|
} catch (e) { |
|
|
|
|
|
LoadingDialog.hideLoadingDialog(context); |
|
|
|
|
|
print(e.toString()); |
|
|
|
|
|
} |
|
|
|
|
|
} else { |
|
|
|
|
|
_autoValidate = true; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
List<DropdownMenuItem<Harvest>> _buildDropMenu(List<Harvest> actions) { |
|
|
|
|
|
return actions |
|
|
|
|
|
.map((action) => DropdownMenuItem<Harvest>( |
|
|
|
|
|
child: Text("Mã thu hoạch " + action.id.toString()), |
|
|
|
|
|
value: action, |
|
|
|
|
|
)) |
|
|
|
|
|
.toList(); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
Widget _dropdownHarvest() { |
|
|
|
|
|
return StreamBuilder( |
|
|
|
|
|
stream: getHarvestBloc.actions, |
|
|
|
|
|
builder: (context, AsyncSnapshot<dynamic> snapshot) { |
|
|
|
|
|
if (snapshot.hasData) { |
|
|
|
|
|
return DropdownButtonFormField<Harvest>( |
|
|
|
|
|
value: harvestValue, |
|
|
|
|
|
hint: Text("Mã thu hoạch"), |
|
|
|
|
|
onChanged: (Harvest newValue) { |
|
|
|
|
|
setState(() { |
|
|
|
|
|
harvestValue = newValue; |
|
|
|
|
|
_sell.harvestId = newValue.id; |
|
|
|
|
|
}); |
|
|
|
|
|
}, |
|
|
|
|
|
validator: (value) => value == null ? "Mã thu hoạch" : null, |
|
|
|
|
|
isExpanded: true, |
|
|
|
|
|
items: _buildDropMenu(_harvests)); |
|
|
|
|
|
} else { |
|
|
|
|
|
return Center( |
|
|
|
|
|
child: CircularProgressIndicator(), |
|
|
|
|
|
); |
|
|
|
|
|
} |
|
|
|
|
|
}, |
|
|
|
|
|
); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
Widget _btnExecuteTimePicker() { |
|
|
|
|
|
return FlatButton( |
|
|
|
|
|
padding: EdgeInsets.only(top: 0.0, right: 0.0, bottom: 0.0, left: 0.0), |
|
|
|
|
|
onPressed: () { |
|
|
|
|
|
DatePicker.showDateTimePicker(context, |
|
|
|
|
|
showTitleActions: true, onChanged: (date) {}, onConfirm: (date) { |
|
|
|
|
|
setState(() { |
|
|
|
|
|
var parsedDate = |
|
|
|
|
|
DateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").format(date); |
|
|
|
|
|
_sell.executeDate = "$parsedDate"; |
|
|
|
|
|
executeTimeView = DateFormat("dd/MM/yyyy HH:mm").format(date); |
|
|
|
|
|
}); |
|
|
|
|
|
}, currentTime: executeTime, locale: LocaleType.vi); |
|
|
|
|
|
}, |
|
|
|
|
|
child: Container( |
|
|
|
|
|
padding: |
|
|
|
|
|
EdgeInsets.only(top: 0.0, right: 0.0, bottom: 10.5, left: 0.0), |
|
|
|
|
|
decoration: BoxDecoration( |
|
|
|
|
|
border: kBorderTextField, |
|
|
|
|
|
), |
|
|
|
|
|
child: Row( |
|
|
|
|
|
children: [ |
|
|
|
|
|
Expanded( |
|
|
|
|
|
child: Text( |
|
|
|
|
|
//TODO: check condition |
|
|
|
|
|
executeTimeView == null ? "$executeTime" : executeTimeView, |
|
|
|
|
|
style: TextStyle(fontSize: 14.0, color: Colors.black87), |
|
|
|
|
|
)), |
|
|
|
|
|
Icon( |
|
|
|
|
|
Icons.date_range, |
|
|
|
|
|
color: Colors.blue, |
|
|
|
|
|
), |
|
|
|
|
|
], |
|
|
|
|
|
))); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
Widget _l1Field() { |
|
|
|
|
|
return TextFormField( |
|
|
|
|
|
keyboardType: TextInputType.numberWithOptions(decimal: true), |
|
|
|
|
|
inputFormatters: [ |
|
|
|
|
|
ThousandsFormatter( |
|
|
|
|
|
formatter: NumberFormat("#,###.##", "es"), allowFraction: true) |
|
|
|
|
|
], |
|
|
|
|
|
decoration: InputDecoration(labelText: "Số lượng/khối lượng loại 1"), |
|
|
|
|
|
controller: _l1Controller, |
|
|
|
|
|
validator: (String value) { |
|
|
|
|
|
return Validators.validNumber(value, "Số lượng/khối lượng loại 1"); |
|
|
|
|
|
}, |
|
|
|
|
|
onSaved: (newValue) { |
|
|
|
|
|
_sell.quantityLv1 = newValue.parseDoubleThousand(); |
|
|
|
|
|
}, |
|
|
); |
|
|
); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
Widget _l2Field() { |
|
|
|
|
|
return TextFormField( |
|
|
|
|
|
keyboardType: TextInputType.numberWithOptions(decimal: true), |
|
|
|
|
|
inputFormatters: [ |
|
|
|
|
|
ThousandsFormatter( |
|
|
|
|
|
formatter: NumberFormat("#,###.##", "es"), allowFraction: true) |
|
|
|
|
|
], |
|
|
|
|
|
decoration: InputDecoration(labelText: "Số lượng/khối lượng loại 2"), |
|
|
|
|
|
controller: _l2Controller, |
|
|
|
|
|
validator: (String value) { |
|
|
|
|
|
return Validators.validNumber(value, "Số lượng/khối lượng loại 2"); |
|
|
|
|
|
}, |
|
|
|
|
|
onSaved: (newValue) { |
|
|
|
|
|
_sell.quantityLv2 = newValue.parseDoubleThousand(); |
|
|
|
|
|
}, |
|
|
|
|
|
); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
Widget _l3Field() { |
|
|
|
|
|
return TextFormField( |
|
|
|
|
|
keyboardType: TextInputType.numberWithOptions(decimal: true), |
|
|
|
|
|
inputFormatters: [ |
|
|
|
|
|
ThousandsFormatter( |
|
|
|
|
|
formatter: NumberFormat("#,###.##", "es"), allowFraction: true) |
|
|
|
|
|
], |
|
|
|
|
|
decoration: InputDecoration(labelText: "Số lượng/khối lượng loại 3"), |
|
|
|
|
|
controller: _l3Controller, |
|
|
|
|
|
validator: (String value) { |
|
|
|
|
|
return Validators.validNumber(value, "Số lượng/khối lượng loại 3"); |
|
|
|
|
|
}, |
|
|
|
|
|
onSaved: (newValue) { |
|
|
|
|
|
_sell.quantityLv3 = newValue.parseDoubleThousand(); |
|
|
|
|
|
}, |
|
|
|
|
|
); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
Widget _removedQuantityField() { |
|
|
|
|
|
return TextFormField( |
|
|
|
|
|
keyboardType: TextInputType.numberWithOptions(decimal: true), |
|
|
|
|
|
inputFormatters: [ |
|
|
|
|
|
ThousandsFormatter( |
|
|
|
|
|
formatter: NumberFormat("#,###.##", "es"), allowFraction: true) |
|
|
|
|
|
], |
|
|
|
|
|
decoration: InputDecoration(labelText: "Số lượng/khối lượng loại bỏ"), |
|
|
|
|
|
controller: _removedQuantityController, |
|
|
|
|
|
validator: (String value) { |
|
|
|
|
|
return Validators.validNumber(value, "Số lượng/khối lượng loại bỏ"); |
|
|
|
|
|
}, |
|
|
|
|
|
onSaved: (newValue) { |
|
|
|
|
|
_sell.removedQuantity = newValue.parseDoubleThousand(); |
|
|
|
|
|
}, |
|
|
|
|
|
); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
Widget _buyerField() { |
|
|
|
|
|
return TextFormField( |
|
|
|
|
|
keyboardType: TextInputType.text, |
|
|
|
|
|
decoration: InputDecoration(labelText: "Khách hàng"), |
|
|
|
|
|
controller: _buyerController, |
|
|
|
|
|
validator: (String value) { |
|
|
|
|
|
return Validators.validateNotNullOrEmpty(value, "Khách hàng"); |
|
|
|
|
|
}, |
|
|
|
|
|
onSaved: (newValue) { |
|
|
|
|
|
_sell.buyer = newValue; |
|
|
|
|
|
}, |
|
|
|
|
|
); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
Widget _descriptionField() { |
|
|
|
|
|
return TextFormField( |
|
|
|
|
|
keyboardType: TextInputType.text, |
|
|
|
|
|
decoration: InputDecoration(labelText: "Ghi chú"), |
|
|
|
|
|
controller: _descriptionController, |
|
|
|
|
|
onSaved: (newValue) { |
|
|
|
|
|
_sell.description = newValue; |
|
|
|
|
|
}, |
|
|
|
|
|
); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
_actionAppBar() { |
|
|
|
|
|
IconButton iconButton; |
|
|
|
|
|
if (1 == 1) { |
|
|
|
|
|
iconButton = IconButton( |
|
|
|
|
|
icon: Icon( |
|
|
|
|
|
Icons.done, |
|
|
|
|
|
color: Colors.black, |
|
|
|
|
|
), |
|
|
|
|
|
onPressed: () { |
|
|
|
|
|
FocusScopeNode currentFocus = FocusScope.of(context); |
|
|
|
|
|
if (!currentFocus.hasPrimaryFocus) { |
|
|
|
|
|
currentFocus.unfocus(); |
|
|
|
|
|
} |
|
|
|
|
|
_validateInputs(); |
|
|
|
|
|
}, |
|
|
|
|
|
); |
|
|
|
|
|
return <Widget>[iconButton]; |
|
|
|
|
|
} |
|
|
|
|
|
return <Widget>[Container()]; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@override |
|
|
|
|
|
Widget build(BuildContext context) => KeyboardDismisser( |
|
|
|
|
|
gestures: [ |
|
|
|
|
|
GestureType.onTap, |
|
|
|
|
|
GestureType.onPanUpdateDownDirection, |
|
|
|
|
|
], |
|
|
|
|
|
child: Scaffold( |
|
|
|
|
|
key: _scaffoldKey, |
|
|
|
|
|
appBar: AppBar( |
|
|
|
|
|
centerTitle: true, |
|
|
|
|
|
title: Text(plot_action_sell), |
|
|
|
|
|
actions: _actionAppBar()), |
|
|
|
|
|
body: KeyboardDismisser( |
|
|
|
|
|
child: MultiBlocProvider( |
|
|
|
|
|
providers: [ |
|
|
|
|
|
BlocProvider<ActionDetailBloc>( |
|
|
|
|
|
create: (context) => |
|
|
|
|
|
ActionDetailBloc(repository: Repository()) |
|
|
|
|
|
..add(FetchData( |
|
|
|
|
|
isNeedFetchData: widget.isEdit, |
|
|
|
|
|
apiActivity: ConstCommon.apiDetailSell, |
|
|
|
|
|
activityId: widget.activityId))), |
|
|
|
|
|
BlocProvider<MediaHelperBloc>( |
|
|
|
|
|
create: (context) => |
|
|
|
|
|
MediaHelperBloc()..add(ChangeListMedia(items: [])), |
|
|
|
|
|
) |
|
|
|
|
|
], |
|
|
|
|
|
child: Form( |
|
|
|
|
|
key: _formKey, |
|
|
|
|
|
autovalidate: _autoValidate, |
|
|
|
|
|
child: SingleChildScrollView( |
|
|
|
|
|
padding: EdgeInsets.all(8.0), |
|
|
|
|
|
child: BlocConsumer<ActionDetailBloc, ActionDetailState>( |
|
|
|
|
|
listener: (context, state) async { |
|
|
|
|
|
if (state is ActionDetailFailure) { |
|
|
|
|
|
LoadingDialog.hideLoadingDialog(context); |
|
|
|
|
|
} else if (state is ActionDetailSuccess) { |
|
|
|
|
|
LoadingDialog.hideLoadingDialog(context); |
|
|
|
|
|
print(state.item); |
|
|
|
|
|
_sell = Sell.fromJson(state.item); |
|
|
|
|
|
_sell.activityId = widget.activityId; |
|
|
|
|
|
_l1Controller.text = |
|
|
|
|
|
_sell.quantityLv1.formatNumtoStringDecimal(); |
|
|
|
|
|
_l2Controller.text = |
|
|
|
|
|
_sell.quantityLv2.formatNumtoStringDecimal(); |
|
|
|
|
|
_l3Controller.text = |
|
|
|
|
|
_sell.quantityLv3.formatNumtoStringDecimal(); |
|
|
|
|
|
_removedQuantityController.text = _sell |
|
|
|
|
|
.removedQuantity |
|
|
|
|
|
.formatNumtoStringDecimal(); |
|
|
|
|
|
_buyerController.text = _sell.buyer ?? ""; |
|
|
|
|
|
_descriptionController.text = |
|
|
|
|
|
_sell.description ?? ""; |
|
|
|
|
|
|
|
|
|
|
|
//select harvest |
|
|
|
|
|
getHarvestBloc.getHarvests((data) { |
|
|
|
|
|
_harvests = data; |
|
|
|
|
|
for (var item in _harvests) { |
|
|
|
|
|
if (item.id == _sell.harvestId) { |
|
|
|
|
|
harvestValue = item; |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
}, (err) {}); |
|
|
|
|
|
|
|
|
|
|
|
try { |
|
|
|
|
|
executeTime = |
|
|
|
|
|
DateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'") |
|
|
|
|
|
.parse(_sell.executeDate); |
|
|
|
|
|
executeTimeView = DateFormat("dd/MM/yyyy HH:mm") |
|
|
|
|
|
.format(executeTime); |
|
|
|
|
|
} catch (_) {} |
|
|
|
|
|
//Show media |
|
|
|
|
|
if (_sell.media != null) { |
|
|
|
|
|
await UtilAction.cacheFiles(_sell.media) |
|
|
|
|
|
.then((value) { |
|
|
|
|
|
BlocProvider.of<MediaHelperBloc>(context) |
|
|
|
|
|
.add(ChangeListMedia(items: value)); |
|
|
|
|
|
}).whenComplete(() { |
|
|
|
|
|
print("completed"); |
|
|
|
|
|
}); |
|
|
|
|
|
} |
|
|
|
|
|
} else if (state is ActionDetailInitial) { |
|
|
|
|
|
} else if (state is ActionDetailLoading) { |
|
|
|
|
|
LoadingDialog.showLoadingDialog(context); |
|
|
|
|
|
} |
|
|
|
|
|
}, |
|
|
|
|
|
builder: (context, state) { |
|
|
|
|
|
return Column( |
|
|
|
|
|
children: <Widget>[ |
|
|
|
|
|
Container( |
|
|
|
|
|
width: double.infinity, |
|
|
|
|
|
child: Text( |
|
|
|
|
|
"Ngày thực hiện", |
|
|
|
|
|
style: TextStyle( |
|
|
|
|
|
color: Colors.black54, fontSize: 13.0), |
|
|
|
|
|
), |
|
|
|
|
|
), |
|
|
|
|
|
_btnExecuteTimePicker(), |
|
|
|
|
|
SizedBox( |
|
|
|
|
|
height: 8.0, |
|
|
|
|
|
), |
|
|
|
|
|
_dropdownHarvest(), |
|
|
|
|
|
SizedBox( |
|
|
|
|
|
height: 8.0, |
|
|
|
|
|
), |
|
|
|
|
|
_l1Field(), |
|
|
|
|
|
SizedBox( |
|
|
|
|
|
height: 8.0, |
|
|
|
|
|
), |
|
|
|
|
|
_l2Field(), |
|
|
|
|
|
SizedBox( |
|
|
|
|
|
height: 8.0, |
|
|
|
|
|
), |
|
|
|
|
|
_l3Field(), |
|
|
|
|
|
SizedBox( |
|
|
|
|
|
height: 8.0, |
|
|
|
|
|
), |
|
|
|
|
|
_removedQuantityField(), |
|
|
|
|
|
SizedBox( |
|
|
|
|
|
height: 8.0, |
|
|
|
|
|
), |
|
|
|
|
|
_buyerField(), |
|
|
|
|
|
SizedBox( |
|
|
|
|
|
height: 8.0, |
|
|
|
|
|
), |
|
|
|
|
|
_descriptionField(), |
|
|
|
|
|
SizedBox( |
|
|
|
|
|
height: 8.0, |
|
|
|
|
|
), |
|
|
|
|
|
BlocBuilder<MediaHelperBloc, MediaHelperState>( |
|
|
|
|
|
builder: (context, state) { |
|
|
|
|
|
if (state is MediaHelperSuccess) { |
|
|
|
|
|
return WidgetMediaPicker( |
|
|
|
|
|
currentItems: state.items, |
|
|
|
|
|
onChangeFiles: (filePaths) async { |
|
|
|
|
|
Get.find<ChangeFileController>() |
|
|
|
|
|
.addAllFile(filePaths); |
|
|
|
|
|
}); |
|
|
|
|
|
} else { |
|
|
|
|
|
return Center( |
|
|
|
|
|
child: CircularProgressIndicator()); |
|
|
|
|
|
} |
|
|
|
|
|
}), |
|
|
|
|
|
], |
|
|
|
|
|
); |
|
|
|
|
|
}, |
|
|
|
|
|
), |
|
|
|
|
|
)), |
|
|
|
|
|
)))); |
|
|
|
|
|
@override |
|
|
|
|
|
void dispose() { |
|
|
|
|
|
_l1Controller.dispose(); |
|
|
|
|
|
_l2Controller.dispose(); |
|
|
|
|
|
_l3Controller.dispose(); |
|
|
|
|
|
_removedQuantityController.dispose(); |
|
|
|
|
|
_descriptionController.dispose(); |
|
|
|
|
|
_buyerController.dispose(); |
|
|
|
|
|
super.dispose(); |
|
|
|
|
|
} |
|
|
} |
|
|
} |