import 'package:farm_tpf/custom_model/action_form/ActionUIField.dart'; import 'package:farm_tpf/custom_model/action_form/ActionUIForm.dart'; import 'package:farm_tpf/data/repository/repository.dart'; import 'package:farm_tpf/presentation/custom_widgets/app_bar_widget.dart'; import 'package:farm_tpf/presentation/custom_widgets/bloc/media_helper_bloc.dart'; import 'package:farm_tpf/presentation/custom_widgets/button_widget.dart'; import 'package:farm_tpf/presentation/custom_widgets/dropdown_supply_widget.dart'; import 'package:farm_tpf/presentation/custom_widgets/widget_action_field_date.dart'; import 'package:farm_tpf/presentation/custom_widgets/widget_field_time_picker.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/custom_widgets/widget_text_field_area.dart'; import 'package:farm_tpf/presentation/custom_widgets/widget_text_form_field.dart'; import 'package:farm_tpf/presentation/screens/actions/cubit/action_ui_cubit.dart'; import 'package:farm_tpf/utils/pref.dart'; import 'package:farm_tpf/utils/validators.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:get/get.dart'; import 'package:keyboard_dismisser/keyboard_dismisser.dart'; import 'state_management_helper/change_file_controller.dart'; class ActionScreen extends StatefulWidget { final int idAction; final String title; ActionScreen({@required this.idAction, @required this.title}); @override _ActionScreenState createState() => _ActionScreenState(); } class _ActionScreenState extends State { final _scaffoldKey = GlobalKey(); var _formKey = GlobalKey(); var pref = LocalPref(); final _executeByController = TextEditingController(); DateTime executeTime = DateTime.now(); List filePaths = List(); var changeFileController = Get.put(ChangeFileController()); Map textFieldControllers = {}; Future getSharedPrefs() async { var currentFullName = await pref.getString(DATA_CONST.CURRENT_FULL_NAME); _executeByController.text = currentFullName ?? ""; } @override void initState() { super.initState(); getSharedPrefs(); } _validateInputs() async { if (_formKey.currentState.validate()) { _formKey.currentState.save(); LoadingDialog.showLoadingDialog(context); filePaths = Get.find().newFiles; //Create request general model try { LoadingDialog.hideLoadingDialog(context); //ADD NEW //Update textFieldControllers.forEach((key, value) { print(textFieldControllers[key].text); }); } catch (e) { LoadingDialog.hideLoadingDialog(context); print(e.toString()); } } else { // } } Widget _btnExecuteTimePicker() { return WidgetFieldDateTimePicker( initDateTime: executeTime, onUpdateDateTime: (selectedDate) { // }); } Widget _executeByField() { return TextFormField( keyboardType: TextInputType.text, decoration: InputDecoration(labelText: "Người thực hiện"), enabled: false, controller: _executeByController, onSaved: (newValue) {}, ); } // // GENERATE DYNAMIC FORM // Widget generateTextField(List fields) { return Container( height: fields.length * 70.0, child: ListView.separated( itemCount: fields.length, separatorBuilder: (context, index) { return SizedBox( height: 8, ); }, itemBuilder: (context, index) { var field = fields[index]; if (field.tbControlTypeName == 'text') { return TextFormField( keyboardType: TextInputType.text, decoration: InputDecoration(labelText: field.description), controller: textFieldControllers[field.id.toString()], onSaved: (newValue) {}, validator: field.isMandatory ? (String value) { return Validators.validateNotNullOrEmpty( value, 'Vui lòng nhập ${field.description}'); } : null, ); } else if (field.tbControlTypeName == 'number') { return WidgetTextFormFieldNumber( hintValue: field.description, textController: textFieldControllers[field.id.toString()], onSaved: (newValue) {}, validator: field.isMandatory ? (String value) { return Validators.validNumberOrEmpty( value, 'Vui lòng nhập ${field.description}'); } : null, ); } else if (field.tbControlTypeName == 'textarea') { return TextFieldAreaWidget( hint: field.description, controller: textFieldControllers[field.id.toString()], onSaved: (newValue) {}); } else if (field.tbControlTypeName == 'dropdown') { return DropdownSupplyWidget( titleName: field.description ?? '', tbSupply: field.tbActivityExtendTypeExternalTable ?? '', tag: field.name, value: field.description, hint: '${field.description} ${field.isMandatory ? '*' : ''}', condition: field.tbActivityExtendTypeCondition, invalidMessage: '', onPressed: (commonData) { print(commonData.name); }); } else if (field.tbControlTypeName == 'date') { return FieldDateWidget( value: field.description, hint: '${field.description} ${field.isMandatory ? '*' : ''}', invalidMessage: '', onPressed: () {}); } else if (field.tbControlTypeName == 'radiobutton') { return Text(field.tbControlTypeName); } else { return Text(field.tbControlTypeName); } }), ); } @override Widget build(BuildContext context) => KeyboardDismisser( gestures: [ GestureType.onTap, GestureType.onPanUpdateDownDirection, ], child: Scaffold( backgroundColor: Colors.white, key: _scaffoldKey, appBar: AppBarWidget( isBack: true, action: InkWell( child: Text( 'Lưu', style: TextStyle( color: Colors.red, fontWeight: FontWeight.normal), ), onTap: () { FocusScopeNode currentFocus = FocusScope.of(context); if (!currentFocus.hasPrimaryFocus) { currentFocus.unfocus(); } _validateInputs(); }, ), ), body: KeyboardDismisser( child: MultiBlocProvider( providers: [ BlocProvider( create: (context) => ActionUiCubit(repository: Repository()) ..getActionUIForm(widget.idAction)), BlocProvider( create: (context) => MediaHelperBloc()..add(ChangeListMedia(items: [])), ) ], child: Form( key: _formKey, child: SafeArea( child: SingleChildScrollView( child: BlocBuilder( builder: (context, state) { if (state is ActionUiLoading) { print('loading...'); return Center(child: CircularProgressIndicator()); } else if (state is ActionUiSuccess) { var actionUiForm = state.item as ActionUIForm; actionUiForm.objectParameterDTOList .forEach((element) { var textEditingController = new TextEditingController(); textFieldControllers.putIfAbsent( element.id.toString(), () => textEditingController); }); return Column( children: [ Padding( padding: const EdgeInsets.all(8.0), child: Column( children: [ 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, ), generateTextField(actionUiForm .objectParameterDTOList), _executeByField(), SizedBox( height: 8.0, ), ], ), ), Container( width: double.infinity, height: 16, color: Colors.grey[200], ), BlocBuilder( builder: (context, state) { if (state is MediaHelperSuccess) { return WidgetMediaPicker( currentItems: state.items, onChangeFiles: (newPathFiles, deletePathFiles) async { Get.find() .change(newPathFiles, deletePathFiles); }); } else { return Center( child: CircularProgressIndicator()); } }), Padding( padding: const EdgeInsets.all(8.0), child: ButtonWidget( title: 'CẬP NHẬT', onPressed: () { FocusScopeNode currentFocus = FocusScope.of(context); if (!currentFocus.hasPrimaryFocus) { currentFocus.unfocus(); } _validateInputs(); }), ), ], ); } else if (state is ActionUiFailure) { print('error'); return Text(state.errorString); // LoadingDialog.hideLoadingDialog(context); } }, ), ), )), )))); @override void dispose() { _executeByController.dispose(); super.dispose(); } }