import 'dart:convert'; import 'dart:io'; // import 'package:konectar_events/constants.dart'; // import 'package:konectar_events/textScalar.dart'; // import 'package:konectar_events/ui_screen/interactionform/model/interaction_data.dart'; // import 'package:konectar_events/ui_screen/interactionform/model/save_interaction.dart'; // import 'package:konectar_events/ui_screen/interactionform/util.dart'; // import 'package:konectar_events/ui_screen/interactionform/viewinteractionprovider.dart'; // import 'package:konectar_events/ui_screen/interactionform/widget/custombutton.dart'; // import 'package:konectar_events/ui_screen/interactionform/widget/customrangeslider.dart'; // import 'package:konectar_events/ui_screen/interactionform/widget/interatciontextfield.dart'; // import 'package:konectar_events/ui_screen/interactionform/widget/responsive_ext.dart'; import 'package:konectar_events/contacts_module/constants.dart'; import 'package:konectar_events/contacts_module/ui_screen/interactionform/model/interaction_data.dart'; import 'package:konectar_events/contacts_module/ui_screen/interactionform/model/save_interaction.dart'; import 'package:konectar_events/contacts_module/ui_screen/interactionform/util.dart'; import 'package:konectar_events/contacts_module/ui_screen/interactionform/viewinteractionprovider.dart'; import 'package:konectar_events/contacts_module/ui_screen/interactionform/widget/custombutton.dart'; import 'package:konectar_events/contacts_module/ui_screen/interactionform/widget/customrangeslider.dart'; import 'package:konectar_events/contacts_module/ui_screen/interactionform/widget/interatciontextfield.dart'; import 'package:konectar_events/contacts_module/ui_screen/interactionform/widget/responsive_ext.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_carousel_widget/flutter_carousel_widget.dart'; import 'package:intl/intl.dart'; import 'package:path_provider/path_provider.dart'; import 'package:provider/provider.dart'; import 'package:dropdown_button2/dropdown_button2.dart'; import 'package:permission_handler/permission_handler.dart'; // import 'package:pwa_ios/widgets/custombutton.dart'; // import 'package:pwa_ios/widgets/customrangeslider.dart'; // import 'package:pwa_ios/widgets/interatciontextfield.dart'; import 'package:file_picker/file_picker.dart'; // import 'package:pwa_ios/widgets/responsive_ext.dart'; import 'package:path/path.dart' as p; class EditInteractionScreen1 extends StatefulWidget { // int index; // String form; SaveInteraction saveInteraction; EditInteractionScreen1( {super.key, // required this.index, // required this.form, required this.saveInteraction}); @override State createState() => _EditInteractionScreenState(); } class _EditInteractionScreenState extends State { List interactionReponseList = []; List sectionList = []; List textEditingControllerList = []; int textfieldIndex = 0; String dropdownvalue = 'Select value'; String? fileName; final TextEditingController textEditingController = TextEditingController(); final CarouselController _controller = CarouselController(); int _currentPage = 0; late int _totalPages = Provider.of(context, listen: false) .interactionReponseList .length; @override void dispose() { super.dispose(); // WidgetsBinding.instance.addPostFrameCallback((timeStamp) { // Provider.of(context, listen: false).dispose(); // }); } @override void initState() { WidgetsBinding.instance.addPostFrameCallback((timeStamp) { // initConfig(); // if (mytimer!.isActive) { // cancelTimer(); // } init(); }); super.initState(); } initConfig() async { // await Provider.of(context, listen: false) // .init(widget.index); await Provider.of(context, listen: false) .initConfigData(); // setState(() {}); } init() async { // await Provider.of(context, listen: false) // .init(widget.index); await Provider.of(context, listen: false) .initSavedForm(widget.saveInteraction); setState(() {}); } @override Widget build(BuildContext context) { return Consumer( builder: (BuildContext context, provider, Widget? child) { // print("build context"); // print("Providerr_is: ${provider.multipletextEditingControllerList}"); return GestureDetector( onTap: () { FocusScope.of(context).requestFocus(FocusNode()); }, child: OrientationBuilder(builder: (context, orientation) { return SafeArea( child: Scaffold( appBar: AppBar( title: Text( widget.saveInteraction.id, style: TextStyle( fontSize: isTablet ? 22 : 14, color: Colors.white), ), // backgroundColor: const Color(0xFF2b9af3), automaticallyImplyLeading: false, actions: [saveActions(provider)], leading: InkWell( onTap: () async { await provider.disposeValues().then((value) { Navigator.pop(context); }); }, child: const Icon( Icons.arrow_back_ios, color: Colors.white, ), ), ), body: Column( mainAxisSize: MainAxisSize.min, children: [ Expanded( // child: ListView.builder( // itemCount: provider.interactionReponseList.length, // padding: EdgeInsets.zero, // cacheExtent: double.parse( // provider.interactionReponseList.length.toString()), // itemBuilder: (context, index) { // var item = provider.interactionReponseList[index]; // sectionList = item.sectionList; child: FlutterCarousel( options: CarouselOptions( onPageChanged: (index, reason) { setState(() { _currentPage = index; }); // Example: Perform actions when reaching the last page // if (_currentPage == _totalPages - 1) { // print('Reached the last page!'); // // Add your actions here // } }, controller: _controller, height: MediaQuery.of(context) .size .height, // Adjust as needed // aspectRatio: 16 / 9, // Optional aspect ratio adjustment //viewportFraction: 0.9, viewportFraction: 1.0, initialPage: 0, enableInfiniteScroll: false, reverse: false, autoPlay: false, autoPlayInterval: Duration(seconds: 3), autoPlayAnimationDuration: Duration(milliseconds: 800), autoPlayCurve: Curves.fastOutSlowIn, enlargeCenterPage: false, disableCenter: false, showIndicator: true, scrollDirection: Axis.horizontal, slideIndicator: CircularWaveSlideIndicator( slideIndicatorOptions: SlideIndicatorOptions( alignment: Alignment.bottomCenter, currentIndicatorColor: Constants.k2color, indicatorBackgroundColor: Colors.grey), ), ), items: provider.interactionReponseList.map((item) { sectionList = item.sectionList; print("Item_sectionListt11: ${item.sectionName}"); print("Item_sectionListt: ${item.sectionList}"); return ListView( children: [ Padding( padding: const EdgeInsets.all(10.0), child: Text( item.sectionName, textAlign: TextAlign.center, style: const TextStyle( color: Colors.black, fontWeight: FontWeight.normal, fontSize: 18.0), ), ), Container( color: Colors.white, child: Padding( padding: const EdgeInsets.only(top: 0.0), child: Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ GridView.count( physics: const NeverScrollableScrollPhysics(), // crossAxisCount: // context.responsive( // 1, // sm: 1, // small // md: 1, // medium // lg: sectionList.length == 1 // ? 1 // : 4, // large // xl: 3, // extra large screen // ), crossAxisCount: context.responsive( 1, sm: 1, // small md: 2, // medium lg: sectionList.length == 1 ? 1 : 3, // large xl: 3, // extra large screen ), mainAxisSpacing: sectionList.length == 1 || !isTablet ? 1 : 3.5, shrinkWrap: true, padding: EdgeInsets.zero, childAspectRatio: sectionList.length == 1 ? orientation == Orientation.landscape ? 10 : 4.8 : isTablet ? 2.8 : 3.5, children: List.generate( sectionList.length, (i) { // print(sectionList); SectionList sectionItem = sectionList[i]; dropdownvalue = sectionItem .widget == InteractionWidget.DROPDOWN ? sectionItem.value ?? "Select" : ' '; List list = sectionItem .widget == InteractionWidget .DROPDOWN || sectionItem.widget == InteractionWidget .AUTOCOMPLETE || sectionItem.widget == InteractionWidget .MULTISELECT ? provider.getData2(sectionItem) : []; provider.checkboxlist = sectionItem .widget == InteractionWidget.CHECKBOX ? provider.getData2(sectionItem) : []; return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ sectionItem.widget == InteractionWidget .BUTTON && sectionItem.input == 'add' ? const SizedBox.shrink() : Padding( padding: const EdgeInsets .only( left: 8.0, right: 8.0), // child: Text( // '${sectionItem.name}:*', // style: TextStyle( // color: Colors // .orange // .shade800, // fontSize: // isTablet // ? 18 // : 12, // ), // ), child: Text( sectionItem.isRequired ? '${sectionItem.name}:*' : '${sectionItem.name}:', style: TextStyle( color: Colors.orange .shade800, fontSize: 18.0, // fontSize: isTablet // ? 18 // : 12, ), ), ), // SizedBox( // height: // isTablet ? 15 : 5, // ), returnWidget( sectionItem: sectionItem, item: item, provider: provider, list: list, gridIndex: i, listIndex: 0, widgetData: sectionItem.widget!, multiple: false), // SizedBox( // height: isTablet ? 15 : 5, // ), ], ); }, ), ), // SizedBox( // height: isTablet ? 15 : 5, // ), item.multiple ? gridViewWidget( provider, item.sectionName, item.multipleList ?? [], orientation, item, 0) : const SizedBox.shrink(), provider.interactionReponseList.length == 0 - 1 ? saveActions(provider) : const SizedBox.shrink() //const Spacer(), ], ), ), ), ], ); }).toList(), ), ), // const Spacer(), // saveActions(provider), Padding( padding: const EdgeInsets.only(bottom: 8.0), child: Align( alignment: Alignment.bottomCenter, child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Flexible( child: OutlinedButton( style: OutlinedButton.styleFrom( shape: CircleBorder()), onPressed: () { //if (_currentPageIndex > _totalPages - 1) _controller.previousPage(); }, child: Padding( padding: EdgeInsets.all(8.0), child: Icon( Icons.arrow_back, color: Constants.k2color, ), ), ), ), Flexible( child: OutlinedButton( style: OutlinedButton.styleFrom( shape: CircleBorder()), // onPressed: () { // _controller.nextPage( // duration: Duration(milliseconds: 300), // curve: Curves.ease, // ); // }, onPressed: () { _controller.nextPage( duration: Duration(milliseconds: 300), curve: Curves.ease, ); }, child: Padding( padding: EdgeInsets.all(8.0), child: Icon( Icons.arrow_forward, color: Constants.k2color, ), ), ), ), ], ), ), ), ], )), ); }), ); }); } Widget returnWidget({ required SectionList sectionItem, required FormFieldData item, required ViewInteractionProvider provider, required List list, required int gridIndex, required int listIndex, required InteractionWidget widgetData, required bool multiple, }) { switch (widgetData) { case InteractionWidget.CHECKBOX: return (sectionItem.inputList!.length >= 5) ? customMultiselectDropdown( sectionItem, provider, sectionItem.inputList!, multiple) : buildCheckbox(sectionItem, item.sectionName, provider, multiple); case InteractionWidget.AUTOCOMPLETE: return customAutoCompletedropdown( sectionItem, provider, list, multiple); case InteractionWidget.MULTISELECT: return customMultiselectDropdown(sectionItem, provider, list, multiple); case InteractionWidget.RADIO: print("Radiiooooo"); return (sectionItem.inputList!.length >= 5) ? customdropdown( sectionItem, provider, sectionItem.inputList!, multiple) : buildRadio(sectionItem, provider); case InteractionWidget.LABEL: return Text(sectionItem.input!); case InteractionWidget.RANGESLIDER: return CustomRangeSlider( sliderPos: sectionItem.selectedValue!.isNotEmpty ? double.parse(sectionItem.selectedValue!.last.toString()) : 10.0, onChanged: (val) { setState(() { sectionItem.selectedValue = []; sectionItem.selectedId = val.toString(); sectionItem.selectedValue!.add(val.toInt()); }); }, ); case InteractionWidget.BUTTON: return sectionItem.input == 'add' ? const Offstage( offstage: true, child: Text("Visible"), ) : Row( children: [ CustomButton( backgroundColor: const Color.fromARGB(255, 233, 229, 229), onPressed: () async { if (sectionItem.selectedValue!.isNotEmpty) { showFilesAlertDialog(context, sectionItem.fileName!.join(','), sectionItem); } else { sectionItem.selectedValue = []; sectionItem.extension = []; sectionItem.fileName = []; await getEncodedFile(sectionItem); } setState(() {}); }, width: 120, height: 40, fontsize: 12, textColor: Colors.black, title: sectionItem.name), const SizedBox( width: 5, ), Text( sectionItem.selectedValue!.isNotEmpty ? 'File Uploaded' : 'No file uploaded', style: TextStyle( color: sectionItem.selectedValue!.isNotEmpty ? Colors.green : Colors.red), ), ], ); case InteractionWidget.TEXT: return sectionItem.input == 'Date' ? buildDateWidget(sectionItem) : sectionItem.input == "textArea" ? Expanded( child: Padding( padding: const EdgeInsets.only(left: 8.0, right: 8.0), child: InteractionTextField( maxchars: int.parse(sectionItem.chars ?? "0"), controller: sectionItem.controller!, labelText: sectionItem.name, // maxlines: 4, // minlines: 3, onChanged: (val) { sectionItem.selectedValue = []; setState(() {}); sectionItem.selectedValue!.add(val); }, ), ), ) : Expanded( child: Padding( padding: const EdgeInsets.only(left: 8.0, right: 8.0), child: SizedBox( // width: isTablet ? 200 : MediaQuery.of(context).size.width, width: MediaQuery.of(context).size.width, height: isTablet ? 50 : 40, child: InteractionTextField( maxchars: int.parse(sectionItem.chars ?? "0"), controller: sectionItem.controller!, inputType: sectionItem.input == "number" ? TextInputType.number : TextInputType.name, labelText: sectionItem.name, onChanged: (val) { sectionItem.selectedValue = []; provider.setTextValue(val, sectionItem, multiple); }, ), ), ), ); case InteractionWidget.DROPDOWN: // return customdropdown(sectionItem, provider, list, multiple); return customAutoCompletedropdown( sectionItem, provider, list, multiple); } } Widget buildDateWidget(SectionList sectionItem) { return Padding( padding: const EdgeInsets.only(left: 8.0, right: 8.0), child: SizedBox( // width: isTablet ? 200 : MediaQuery.of(context).size.width, width: MediaQuery.of(context).size.width, // height: isTablet ? 50 : 40, child: TextField( controller: sectionItem.controller, //editing controller of this TextField decoration: InputDecoration( // border: OutlineInputBorder(), border: OutlineInputBorder( borderRadius: BorderRadius.circular(10.0), ), labelStyle: const TextStyle(fontSize: 16), suffixIcon: const Icon(Icons.calendar_today), //icon of text field labelText: "Enter Date" //label text of field ), readOnly: true, //set it true, so that user will not able to edit text onTap: () async { DateTime? pickedDate = await showDatePicker( context: context, initialDate: DateTime.now(), firstDate: DateTime( 2000), //DateTime.now() - not to allow to choose before today. lastDate: DateTime(2101)); if (pickedDate != null) { print( pickedDate); //pickedDate output format => 2021-03-10 00:00:00.000 String formattedDate = DateFormat('yyyy-MM-dd').format(pickedDate); print( formattedDate); //formatted date output using intl package => 2021-03-16 //you can implement different kind of Date Format here according to your requirement setState(() { sectionItem.controller!.text = formattedDate; sectionItem.selectedValue = []; sectionItem.selectedValue! .add(formattedDate); //set output date to TextField value. }); } else { print("Date is not selected"); } }, ), ), ); } Widget saveActions(ViewInteractionProvider provider) { return Align( alignment: Alignment.centerRight, child: Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ Padding( //padding: const EdgeInsets.all(4.0), padding: const EdgeInsets.only(top: 8.0, bottom: 8.0, right: 5.0), child: CustomButton( backgroundColor: Colors.green.shade500, onPressed: () async { // if (textFieldsValidation(provider).isEmpty) { await provider.saveJsonObject(context, widget.saveInteraction.intId, widget.saveInteraction); // showAlertDialog(context, widget.saveInteraction.id); print("Validation_isss: ${provider.isLoading}"); if (provider.isLoading == false) { print("Validation_false"); showAlertDialog1(context, "Please fill all the fields"); } else { showAlertDialog(context, widget.saveInteraction.id); print("Validation_True"); } // } else { // _displaySnackBar(textFieldsValidation(provider)); // } }, textColor: Colors.white, title: "Update", // height: 40, // width: isTablet ? 120 : 80, height: MediaQuery.of(context).size.height * 0.2, fontsize: isTablet ? 16 : 12, ), ), SizedBox( width: isTablet ? 20 : 2, ), ], ), ); } Widget buildRadio(SectionList sectionItem, ViewInteractionProvider provider) { List list = provider.getData2(sectionItem); // .map((itemWord) => InputClass.fromJson(itemWord)) // .toList(); return Padding( padding: const EdgeInsets.only(left: 8.0, right: 8.0), child: SizedBox( // width: isTablet ? 250 : MediaQuery.of(context).size.width, width: MediaQuery.of(context).size.width, child: Row( children: [ for (InputClass value in list) Row( children: [ Radio( value: value.name, activeColor: Colors.black, groupValue: provider.radioValue, onChanged: (String? value) { setState(() { // print(value); provider.radioValue = value!; int index = list.indexWhere((element) => element.name == value); sectionItem.selectedValue!.add(list[index].id); }); }, ), Text(value.name), ], ), ], ), ), ); } Widget buildCheckbox(SectionList sectionItem, String sectionName, ViewInteractionProvider provider, bool multiple) { return Padding( padding: const EdgeInsets.only(left: 8.0, right: 8.0), child: SizedBox( // width: 250, width: MediaQuery.of(context).size.width, child: Row( children: [ for (var value in provider.checkboxlist) Row( children: [ CheckboxListTile( dense: true, value: value.ischecked ?? false, activeColor: Colors.black, checkColor: Colors.white, onChanged: (bool? newvalue) { value.ischecked = newvalue!; provider.setcheckBoxValue(sectionItem, sectionName, newvalue, value.id, multiple); //setState(() {}); }, ), Text(value.name), ], ), ], ), ), ); } Widget customdropdown(SectionList sectionItem, ViewInteractionProvider provider, List list, bool multiple) { // sectionItem.value = ''; // print("%%%%${sectionItem.selectedValue!.last}"); print("ItemList_is: $list"); if (list.isEmpty) { print("###list empty###"); list = []; InputClass inputClass = InputClass(id: "no value", name: "Select ${sectionItem.name}"); list.add(inputClass); sectionItem.selectedObject = list[0]; } // InputClass selectedObj = list[0]; return Padding( padding: const EdgeInsets.only(left: 8.0, right: 8.0), child: SizedBox( // width: isTablet ? 200 : MediaQuery.of(context).size.width, // height: isTablet ? 60 : 40, width: MediaQuery.of(context).size.width, child: DropdownButtonFormField2( isExpanded: true, decoration: InputDecoration( isDense: true, // Add Horizontal padding using menuItemStyleData.padding so it matches // the menu padding when button's width is not specified. contentPadding: const EdgeInsets.symmetric(vertical: 5), border: OutlineInputBorder( borderRadius: BorderRadius.circular(10.0), ), // Add more decoration.. ), hint: Text( 'Select ${sectionItem.name}', style: const TextStyle(fontSize: 14), ), items: list .map((item) => DropdownMenuItem( value: item, child: Text( item.name, style: const TextStyle( fontSize: 14, ), ), )) .toList(), value: sectionItem.selectedValue!.isNotEmpty ? list[list.indexWhere( (element) => element.id == sectionItem.selectedValue!.last, )] : list[0], // // provider.getDropDownValue(sectionItem.value!, sectionItem, list) // sectionItem.value ?? list[0].name, validator: (value) { if (value == null) { return 'Please select ${sectionItem.name}'; } return null; }, onChanged: (value) { //Do something when selected item is changed. sectionItem.selectedObject = value!; sectionItem.value = value.id; provider.setDropDownValue(value.id, sectionItem, multiple, value); print("selected ${sectionItem.value}"); // setState(() {}); }, onSaved: (value) { sectionItem.selectedObject = value!; sectionItem.value = value.id; provider.setDropDownValue(value.id, sectionItem, multiple, value); // setState(() {}); }, buttonStyleData: const ButtonStyleData( padding: EdgeInsets.only(right: 8), ), iconStyleData: const IconStyleData( icon: Icon( Icons.arrow_drop_down, color: Colors.black45, ), iconSize: 24, ), dropdownStyleData: DropdownStyleData( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), ), ), menuItemStyleData: const MenuItemStyleData( padding: EdgeInsets.symmetric(horizontal: 16), ), ), ), ); } Widget customAutoCompletedropdown(SectionList sectionItem, ViewInteractionProvider provider, List list, bool multiple) { // sectionItem.value = list[0].name; if (list.isEmpty) { list = sectionItem.inputList!; } //InputClass selectedObj = list[0]; return Padding( padding: const EdgeInsets.only(left: 8.0, right: 8.0), child: SizedBox( // width: isTablet ? 200 : MediaQuery.of(context).size.width, // height: isTablet ? 60 : 40, width: MediaQuery.of(context).size.width, child: DropdownButtonHideUnderline( child: DropdownButtonFormField2( isExpanded: true, decoration: InputDecoration( // Add Horizontal padding using menuItemStyleData.padding so it matches // the menu padding when button's width is not specified. contentPadding: const EdgeInsets.symmetric(vertical: 5), border: OutlineInputBorder( borderRadius: BorderRadius.circular(10), ), // Add more decoration.. ), hint: Text( 'Select Item', style: TextStyle( fontSize: 14, color: Theme.of(context).hintColor, ), ), items: list .map((item) => DropdownMenuItem( value: item, child: Text( item.name, style: const TextStyle( fontSize: 14, ), ), )) .toList(), value: sectionItem.selectedObject, onSaved: (value) { sectionItem.selectedObject = value!; provider.setAutoCompleteValue(value.id, sectionItem, multiple); sectionItem.value = value.name; }, onChanged: (value) { // setState(() { sectionItem.selectedObject = value!; provider.setAutoCompleteValue(value.id, sectionItem, multiple); sectionItem.value = value.name; // setState(() {}); //}); }, buttonStyleData: const ButtonStyleData( padding: EdgeInsets.symmetric(horizontal: 16), height: 40, width: 200, ), dropdownStyleData: const DropdownStyleData( maxHeight: 200, ), menuItemStyleData: const MenuItemStyleData( height: 40, ), dropdownSearchData: DropdownSearchData( searchController: textEditingController, searchInnerWidgetHeight: 50, searchInnerWidget: Container( height: 50, padding: const EdgeInsets.only( top: 8, bottom: 4, right: 8, left: 8, ), child: TextFormField( expands: true, maxLines: null, controller: textEditingController, decoration: InputDecoration( isDense: true, contentPadding: const EdgeInsets.symmetric( horizontal: 10, vertical: 18, ), hintText: 'Search for an item...', hintStyle: const TextStyle(fontSize: 12), border: OutlineInputBorder( borderRadius: BorderRadius.circular(10), ), ), ), ), searchMatchFn: (item, searchValue) { return item.value!.name.toString().contains(searchValue); }, ), //This to clear the search value when you close the menu onMenuStateChange: (isOpen) { if (!isOpen) { textEditingController.clear(); } }, ), ), ), ); } Widget customMultiselectDropdown(SectionList sectionItem, ViewInteractionProvider provider, List list, bool multiple) { if (list.isEmpty) { list = sectionItem.inputList!; } InputClass selectedObj = list[0]; return Padding( padding: const EdgeInsets.only(left: 8.0, right: 8.0), child: SizedBox( // width: isTablet ? 200 : MediaQuery.of(context).size.width, // height: isTablet ? 60 : 40, width: MediaQuery.of(context).size.width, child: DropdownButtonHideUnderline( child: DropdownButtonFormField2( isExpanded: true, decoration: InputDecoration( isDense: true, // Add Horizontal padding using menuItemStyleData.padding so it matches // the menu padding when button's width is not specified. contentPadding: const EdgeInsets.symmetric(vertical: 5), border: OutlineInputBorder( borderRadius: BorderRadius.circular(10), ), // Add more decoration.. ), hint: Text( 'Select Items', style: TextStyle( fontSize: 14, color: Theme.of(context).hintColor, ), ), items: list.map((item) { return DropdownMenuItem( value: item, //disable default onTap to avoid closing menu when selecting an item enabled: false, child: StatefulBuilder( builder: (context, menuSetState) { final isSelected = sectionItem.selectedValue!.contains(item.name); return InkWell( onTap: () { isSelected ? sectionItem.selectedValue!.remove(item.name) : sectionItem.selectedValue!.add(item.name); //This rebuilds the StatefulWidget to update the button's text setState(() {}); //This rebuilds the dropdownMenu Widget to update the check mark menuSetState(() {}); }, child: Container( height: double.infinity, padding: const EdgeInsets.symmetric(horizontal: 16.0), child: Row( children: [ if (isSelected) const Icon(Icons.check_box_outlined) else const Icon(Icons.check_box_outline_blank), const SizedBox(width: 16), Expanded( child: Text( item.name, style: const TextStyle( fontSize: 14, ), ), ), ], ), ), ); }, ), ); }).toList(), //Use last selected item as the current value so if we've limited menu height, it scroll to last item. value: selectedObj, // ? null // : provider.selectedItems.last, onChanged: (value) { selectedObj = value!; provider.setAutoCompleteValue(value.id, sectionItem, multiple); sectionItem.value = value.name; }, onSaved: (value) { selectedObj = value!; provider.setAutoCompleteValue(value.id, sectionItem, multiple); sectionItem.value = value.name; }, selectedItemBuilder: (context) { return list.map( (item) { return Container( alignment: AlignmentDirectional.center, child: Text( sectionItem.selectedValue!.join(', '), style: const TextStyle( fontSize: 14, overflow: TextOverflow.ellipsis, ), maxLines: 1, ), ); }, ).toList(); }, buttonStyleData: const ButtonStyleData( padding: EdgeInsets.only(left: 16, right: 8), height: 40, width: 140, ), menuItemStyleData: const MenuItemStyleData( height: 40, padding: EdgeInsets.zero, ), ), ), ), ); } Widget gridViewWidget( ViewInteractionProvider provider, String sectionName, List sectionList, Orientation orientation, FormFieldData item, int listIndex) { print("SectionListtt:isss: $sectionList"); List pooja = sectionList; print("Pooja: $pooja"); List> convertedArray = []; print("Provider Length: ${item.sectionList.length}"); for (int i = 0; i < sectionList.length; i += item.sectionList.length + 1) { print("Section List11111: $sectionList"); print("item.sectionList.length List11111: ${item.sectionList.length}"); convertedArray .add(sectionList.sublist(i, i + item.sectionList.length + 1)); } print("ConvertedArrayEditMulti.leangth: $convertedArray"); print("ConvertedArray.leangth: ${convertedArray.length}"); return Column( children: [ for (var i = 0; i < convertedArray.length; i++) DecoratedBox( decoration: BoxDecoration( color: i % 2 == 0 ? Color.fromARGB(133, 213, 241, 254) : Colors.white, ), child: Wrap( children: [ //GestureDetector(child: Text("data")), GridView.builder( physics: const NeverScrollableScrollPhysics(), gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: context.responsive( 1, sm: 1, // small md: 2, // medium lg: sectionList.length == 1 ? 1 : (sectionList.length >= 1 ? 3 : 3), // large xl: 3, // extra large screen ), mainAxisSpacing: sectionList.length == 1 || !isTablet ? 1 : 2, childAspectRatio: sectionList.length == 1 ? orientation == Orientation.landscape ? 10 : 4.8 : isTablet ? 2.8 : 3.0, ), shrinkWrap: true, padding: EdgeInsets.zero, itemCount: convertedArray[i].length, itemBuilder: (context, index) { SectionList sectionItem = convertedArray[i][index]; dropdownvalue = sectionItem.widget == InteractionWidget.DROPDOWN ? sectionItem.value ?? "Select" : ' '; List list = sectionItem.widget == InteractionWidget.DROPDOWN || sectionItem.widget == InteractionWidget.AUTOCOMPLETE || sectionItem.widget == InteractionWidget.MULTISELECT ? provider.getData2(sectionItem) : []; provider.checkboxlist = sectionItem.widget == InteractionWidget.CHECKBOX ? provider.getData2(sectionItem) : []; return SizedBox( height: MediaQuery.of(context).size.height, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ sectionItem.widget == InteractionWidget.BUTTON && sectionItem.param == 'add' || sectionItem.param == 'deletebtn' ? const SizedBox.shrink() : Padding( padding: const EdgeInsets.only( left: 8.0, right: 8.0), child: Text( sectionItem.isRequired ? '${sectionItem.name}:*' : '${sectionItem.name}:', style: TextStyle( color: Colors.orange.shade800, fontSize: 18.0, // fontSize: isTablet // ? 18 // : 12, ), )), const SizedBox( height: 15, ), sectionItem.widget == InteractionWidget.BUTTON ? sectionItem.input == 'chooseFile' ? Row( children: [ CustomButton( backgroundColor: const Color.fromARGB( 255, 233, 229, 229), onPressed: () async { if (sectionItem.selectedValue! .isNotEmpty) { showFilesAlertDialog( context, sectionItem.fileName! .join(','), sectionItem); } else { sectionItem.selectedValue = []; sectionItem.extension = []; sectionItem.fileName = []; await getEncodedFile( sectionItem); } setState(() {}); }, width: 120, height: 40, fontsize: 12, textColor: Colors.black, title: sectionItem.name), const SizedBox( width: 5, ), Text( sectionItem .selectedValue!.isNotEmpty ? 'File uploaded' : 'No file uploaded', style: TextStyle( color: sectionItem .selectedValue! .isNotEmpty ? Colors.green : Colors.red), ), ], ) : isTablet ? IconButton( onPressed: () { provider.deleteMultipleRows( sectionItem.gid!, sectionList[i], sectionName); setState(() {}); }, icon: const Icon( Icons.cancel, size: 30, color: Color.fromARGB( 255, 8, 39, 92), ), ) : Padding( padding: const EdgeInsets.only( left: 8.0, right: 8.0), child: CustomButton( backgroundColor: const Color.fromARGB( 255, 233, 75, 75), onPressed: () { provider.deleteMultipleRows( sectionItem.gid!, sectionList[i], sectionName); setState(() {}); }, // width: 80, // height: 30, height: 40, fontsize: 12, textColor: Colors.white, title: "Delete"), ) : returnWidget( sectionItem: sectionItem, item: item, provider: provider, list: list, gridIndex: i, listIndex: listIndex, widgetData: sectionItem.widget!, multiple: true), ], ), ); }), ], ), ), ], ); } String textFieldsValidation(ViewInteractionProvider provider) { if (provider.sectionList .any((element) => element.controller!.text.isEmpty)) { return 'Fields cannot be empty'; } if (provider.textEditingControllerList.isNotEmpty) { if (provider.validateTextFields()) { return 'Fields cannot be empty'; } } if (provider.multipletextEditingControllerList.isNotEmpty) { if (provider.validateMultipleRows()) { return 'Fields cannot be empty'; } } return ''; } _displaySnackBar(String msg) { final snackBar = SnackBar( content: Text( msg, style: const TextStyle(fontSize: 20.0, fontWeight: FontWeight.bold), )); ScaffoldMessenger.of(context).showSnackBar(snackBar); //scaffoldKeyLogin.currentState!.showSnackBar(snackBar); } Future getEncodedFile(SectionList sectionItem) async { String base64Image = ''; var status = Platform.isAndroid ? await Permission.manageExternalStorage.status : await Permission.storage.status; if (status.isGranted) { FilePickerResult? result = await FilePicker.platform.pickFiles(allowMultiple: true); if (result != null) { print(result.files.first.path); print(result.files.last.path); for (var files in result.files) { File file = File(files.path!); print("check file path : ${file.path}"); fileName = file.path.split('/').last; // Get the application folder directory Directory? directory = Platform.isAndroid ? await getExternalStorageDirectory() //FOR ANDROID : await getApplicationDocumentsDirectory(); String newPath = ""; //FOR ios String convertedDirectoryPath = (directory?.path).toString(); print("see the converted directory path $convertedDirectoryPath"); newPath = "$convertedDirectoryPath/konectar/files"; print("new path :$newPath"); directory = Directory(newPath); if (!await directory.exists()) { await directory.create(recursive: true); } File newFile = await file.copy('${directory.path}/$fileName'); print("new path is ${newFile.path}"); final extension = p.extension(newFile.path); List imageBytes = await newFile.readAsBytes(); Uint8List imageUint8List = Uint8List.fromList(imageBytes); base64Image = base64Encode(imageUint8List); sectionItem.selectedValue!.add(base64Image); sectionItem.extension!.add(extension); sectionItem.fileName!.add(fileName); } } } else { print("not permitted"); await requestPermission(Platform.isAndroid ? Permission.manageExternalStorage : Permission.storage); } } Future requestPermission(Permission permission) async { final status = await permission.request(); setState(() { print(status); }); } showAlertDialog(BuildContext context, String record) { // set up the buttons // ViewInteractionProvider provider = // Provider.of(context, listen: false); Widget cancelButton = TextButton( child: const Text("Ok"), onPressed: () async { Navigator.of(context).pop(); Navigator.of(context).pop(); }, ); // set up the AlertDialog AlertDialog alert = AlertDialog( title: const Text(""), content: Text("Form $record Updated Successfully!"), actions: [ cancelButton, ], ); // show the dialog showDialog( context: context, builder: (BuildContext context) { return alert; }, ); } showAlertDialog1(BuildContext context, String record) { // set up the buttons // ViewInteractionProvider provider = // Provider.of(context, listen: false); Widget cancelButton = TextButton( child: const Text("Ok"), onPressed: () async { Navigator.of(context).pop(); }, ); // set up the AlertDialog AlertDialog alert = AlertDialog( title: const Text(""), content: Text(record), actions: [ cancelButton, ], ); // show the dialog showDialog( context: context, builder: (BuildContext context) { return alert; }, ); } showFilesAlertDialog( BuildContext context, String files, SectionList sectionItem) { // set up the buttons // ViewInteractionProvider provider = // Provider.of(context, listen: false); Widget cancelButton = TextButton( child: const Text("Upload"), onPressed: () async { Navigator.of(context).pop(); sectionItem.selectedValue = []; sectionItem.extension = []; sectionItem.fileName = []; await getEncodedFile(sectionItem); }, ); Widget okButton = TextButton( child: const Text("Cancel"), onPressed: () async { Navigator.of(context).pop(); }, ); // set up the AlertDialog AlertDialog alert = AlertDialog( title: const Text(""), content: Text( "Following File(s) $files uploaded .Do you still want to upload files ?", style: const TextStyle(fontSize: 15), ), actions: [cancelButton, okButton], ); // show the dialog showDialog( context: context, builder: (BuildContext context) { return alert; }, ); } }