734 lines
27 KiB
Dart
734 lines
27 KiB
Dart
import 'dart:collection';
|
|
import 'dart:convert';
|
|
|
|
// import 'package:discover_module/constants.dart';
|
|
// import 'package:discover_module/provider_class/engagement_provider.dart';
|
|
// import 'package:discover_module/ui_screen/bottom_sheet.dart';
|
|
// import 'package:flutter/cupertino.dart';
|
|
import 'package:discover_module/contacts_module/constants.dart';
|
|
import 'package:discover_module/contacts_module/provider_class/engagement_provider.dart';
|
|
import 'package:discover_module/contacts_module/ui_screen/bottom_sheet.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter/widgets.dart';
|
|
import 'package:intl/intl.dart';
|
|
import 'package:provider/provider.dart';
|
|
import 'package:multi_dropdown/multiselect_dropdown.dart';
|
|
|
|
class EngagementList extends StatefulWidget {
|
|
const EngagementList({super.key});
|
|
|
|
@override
|
|
State<EngagementList> createState() => _EngagementListState();
|
|
}
|
|
|
|
class _EngagementListState extends State<EngagementList> {
|
|
List eng = [];
|
|
|
|
List filteredList = [];
|
|
List hcpname = [];
|
|
List main = [];
|
|
List rel = [];
|
|
List level = [];
|
|
|
|
DateTime? selectedDate;
|
|
final TextEditingController textController = TextEditingController();
|
|
|
|
bool calview = false;
|
|
String start = '', end = '';
|
|
|
|
TextEditingController _searchController = TextEditingController();
|
|
|
|
final TextEditingController startController = TextEditingController();
|
|
final TextEditingController endController = TextEditingController();
|
|
|
|
String searchQuery = '';
|
|
|
|
List<String> _dropDownValue1 = [],
|
|
_dropDownValue2 = [],
|
|
_dropDownValue3 = [],
|
|
_dropDownValue4 = [],
|
|
_dropDownValue5 = [];
|
|
|
|
final TextEditingController textController1 = TextEditingController();
|
|
|
|
@override
|
|
void initState() {
|
|
// TODO: implement initState
|
|
super.initState();
|
|
init();
|
|
}
|
|
|
|
Future<void> init() async {
|
|
var engagement =
|
|
await Provider.of<EnagagementProvider>(context, listen: false);
|
|
final data = engagement.getengagementdata();
|
|
|
|
final data1 = engagement.engagementdata;
|
|
|
|
engagement.gethcpname();
|
|
hcpname = engagement.engagementhcppname;
|
|
|
|
print("getnewData: ${hcpname}");
|
|
|
|
engagement.getmaintherepeutic();
|
|
|
|
engagement.getrelationship();
|
|
|
|
engagement.getrelationlevel();
|
|
|
|
setState(() {
|
|
eng = data1;
|
|
|
|
filteredList = eng;
|
|
|
|
main = engagement.enagementhcppmain;
|
|
|
|
rel = engagement.enagementhcpprel;
|
|
level = engagement.enagementhcplevel;
|
|
});
|
|
}
|
|
|
|
void _filterList(String query) {
|
|
print('filteredList_is: $filteredList');
|
|
setState(() {
|
|
searchQuery = query;
|
|
filteredList = eng
|
|
.where((item) => item['main thereutic area']
|
|
.toLowerCase()
|
|
.contains(query.toLowerCase()))
|
|
.toList();
|
|
});
|
|
}
|
|
|
|
void filtermulti(List<String> query, List<String> query2, List<String> query3,
|
|
List<String> query4, String startt, String endd) {
|
|
print("query: $query");
|
|
print("query2: $query2");
|
|
print("query3: $query3");
|
|
print("query4: $query4");
|
|
print("startt: $startt");
|
|
print("endd: $endd");
|
|
|
|
// Apply Filters to Each List
|
|
// List<String> filteredQuery1 = filterList(query);
|
|
// List<String> filteredQuery2 = filterList(query2);
|
|
// List<String> filteredQuery3 = filterList(query3);
|
|
// List<String> filteredQuery4 = filterList(query4);
|
|
|
|
// // Print Results
|
|
// print('Filtered Query 1: $filteredQuery1');
|
|
// print('Filtered Query 2: $filteredQuery2');
|
|
// print('Filtered Query 3: $filteredQuery3');
|
|
// print('Filtered Query 4: $filteredQuery4');
|
|
|
|
// Function to filter a list based on each element being used as a keyword
|
|
|
|
// filteredList = eng.where((map) {
|
|
// String value = map['main thereutic area']?.toLowerCase() ?? '';
|
|
// return query.any((keyword) => value.contains(keyword.toLowerCase()));
|
|
// }).toList();
|
|
|
|
final DateFormat formatter = DateFormat('dd-MM-yyyy');
|
|
|
|
//DateTime itemDate = formatter.parse(map['date']);
|
|
|
|
setState(() {
|
|
filteredList = eng
|
|
.where((map) =>
|
|
// String value = map['main thereutic area'].toLowerCase();
|
|
|
|
//print("Vlaueee_isss: ${value} ${query2}");
|
|
query2.any((keyword) => map['main thereutic area']
|
|
.toLowerCase()
|
|
.contains(keyword.toLowerCase())) ||
|
|
query.any((keyword) => map['hcpname']
|
|
.toLowerCase()
|
|
.contains(keyword.toLowerCase())) ||
|
|
query3.any((keyword) => map['relationship with chiesi']
|
|
.toLowerCase()
|
|
.contains(keyword.toLowerCase())) ||
|
|
query4.any((keyword) => map['level of engagement']
|
|
.toLowerCase()
|
|
.contains(keyword.toLowerCase()))
|
|
//||
|
|
// formatter
|
|
// .parse(map['date'])
|
|
// .isAfter(formatter.parse(startt)) &&
|
|
// formatter
|
|
// .parse(map['date'])
|
|
// .isBefore(formatter.parse(endd))
|
|
// ||
|
|
// (DateTime.parse(map['date']).isAfter(DateTime.parse(startt)) &&
|
|
// DateTime.parse(map['date'])
|
|
// .isBefore(DateTime.parse(endd).add(Duration(days: 1))))
|
|
)
|
|
.toList();
|
|
});
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Scaffold(
|
|
appBar: AppBar(
|
|
title: Text("Enagagement"),
|
|
),
|
|
endDrawer: Drawer(
|
|
child: ListView(
|
|
children: [
|
|
Row(
|
|
children: [
|
|
Expanded(
|
|
flex: 1,
|
|
child: Padding(
|
|
padding: const EdgeInsets.all(8.0),
|
|
child: TextFormField(
|
|
controller: startController,
|
|
readOnly: true, // Make the TextFormField read-only
|
|
decoration: InputDecoration(
|
|
isDense: true,
|
|
labelText: 'Start Date',
|
|
// suffixIcon: Icon(Icons.calendar_today),
|
|
enabledBorder: OutlineInputBorder(
|
|
borderSide: BorderSide(color: Colors.black),
|
|
borderRadius: BorderRadius.circular(10))),
|
|
onTap: () =>
|
|
_selectDate(context), // Show date picker on tap
|
|
),
|
|
),
|
|
),
|
|
Expanded(
|
|
flex: 1,
|
|
child: Padding(
|
|
padding: const EdgeInsets.all(8.0),
|
|
child: TextFormField(
|
|
controller: endController,
|
|
readOnly: true, // Make the TextFormField read-only
|
|
decoration: InputDecoration(
|
|
isDense: true,
|
|
labelText: 'End Date',
|
|
// suffixIcon: Icon(Icons.calendar_today),
|
|
enabledBorder: OutlineInputBorder(
|
|
borderSide: BorderSide(color: Colors.black),
|
|
borderRadius: BorderRadius.circular(10))),
|
|
onTap: () =>
|
|
_selectDate1(context), // Show date picker on tap
|
|
),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
Padding(
|
|
padding: const EdgeInsets.all(8.0),
|
|
child: MultiSelectDropDown.network(
|
|
borderColor: Colors.black,
|
|
fieldBackgroundColor: Colors.transparent,
|
|
hint: "Select Employee Name",
|
|
dropdownHeight: 300,
|
|
onOptionSelected: (options) {
|
|
debugPrint("checkking" + options.toString());
|
|
|
|
// String label = options[0].label;
|
|
List<String> label1 = [];
|
|
|
|
// var label;
|
|
// debugPrint("checkking " + label);
|
|
|
|
// for (var option in options) {
|
|
// label1.add(option.label);
|
|
// debugPrint("Selected label: $label");
|
|
// }
|
|
|
|
for (var option in options) {
|
|
print("Options_isssssss: ${option}");
|
|
if (option.label.isNotEmpty) {
|
|
label1.add(option.label);
|
|
} else {
|
|
label1.clear();
|
|
}
|
|
debugPrint("Selected label: $label1, ${option.label}");
|
|
}
|
|
setState(() {
|
|
_dropDownValue1 = label1;
|
|
});
|
|
},
|
|
searchEnabled: true,
|
|
networkConfig: NetworkConfig(
|
|
url: '${Constants.url}/engagement',
|
|
method: RequestMethod.get,
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
},
|
|
),
|
|
chipConfig: const ChipConfig(wrapType: WrapType.wrap),
|
|
responseParser: (response) {
|
|
final list = (response as List<dynamic>).map((e) {
|
|
final item = e as Map<String, dynamic>;
|
|
return ValueItem(
|
|
label: item['hcpname'],
|
|
value: item['id'].toString(),
|
|
);
|
|
}).toList();
|
|
|
|
return Future.value(list);
|
|
},
|
|
responseErrorBuilder: ((context, body) {
|
|
return const Padding(
|
|
padding: EdgeInsets.all(16.0),
|
|
child: Text('Error fetching the data'),
|
|
);
|
|
}),
|
|
),
|
|
),
|
|
Padding(
|
|
padding: const EdgeInsets.all(8.0),
|
|
child: MultiSelectDropDown.network(
|
|
borderColor: Colors.black,
|
|
fieldBackgroundColor: Colors.transparent,
|
|
hint: "Select Main Therapeutic Area",
|
|
dropdownHeight: 300,
|
|
onOptionSelected: (options) {
|
|
debugPrint(options.toString());
|
|
|
|
// String label = options[0].label;
|
|
List<String> label1 = [];
|
|
|
|
// var label;
|
|
// debugPrint("checkking " + label);
|
|
|
|
// for (var option in options) {
|
|
// label1.add(option.label);
|
|
// debugPrint("Selected label: $label");
|
|
// }
|
|
|
|
for (var option in options) {
|
|
print("Options_isssssss: ${option}");
|
|
if (option.label.isNotEmpty) {
|
|
label1.add(option.label);
|
|
} else {
|
|
label1.clear();
|
|
}
|
|
debugPrint("Selected label: $label1, ${option.label}");
|
|
}
|
|
setState(() {
|
|
_dropDownValue2 = label1;
|
|
});
|
|
},
|
|
searchEnabled: true,
|
|
networkConfig: NetworkConfig(
|
|
url: '${Constants.url}/engagement',
|
|
method: RequestMethod.get,
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
},
|
|
),
|
|
chipConfig: const ChipConfig(wrapType: WrapType.wrap),
|
|
responseParser: (response) {
|
|
final list = (response as List<dynamic>).map((e) {
|
|
final item = e as Map<String, dynamic>;
|
|
return ValueItem(
|
|
label: item['main thereutic area'],
|
|
value: item['id'].toString(),
|
|
);
|
|
}).toList();
|
|
|
|
return Future.value(list);
|
|
},
|
|
responseErrorBuilder: ((context, body) {
|
|
return const Padding(
|
|
padding: EdgeInsets.all(16.0),
|
|
child: Text('Error fetching the data'),
|
|
);
|
|
}),
|
|
),
|
|
),
|
|
Padding(
|
|
padding: const EdgeInsets.all(8.0),
|
|
child: MultiSelectDropDown.network(
|
|
borderColor: Colors.black,
|
|
fieldBackgroundColor: Colors.transparent,
|
|
hint: "Select Relationship with Chiesi",
|
|
dropdownHeight: 300,
|
|
onOptionSelected: (options) {
|
|
debugPrint(options.toString());
|
|
|
|
// String label = options[0].label;
|
|
List<String> label1 = [];
|
|
|
|
// var label;
|
|
// debugPrint("checkking " + label);
|
|
|
|
// for (var option in options) {
|
|
// label1.add(option.label);
|
|
// debugPrint("Selected label: $label");
|
|
// }
|
|
for (var option in options) {
|
|
print("Options_isssssss: ${option}");
|
|
if (option.label.isNotEmpty) {
|
|
label1.add(option.label);
|
|
} else {
|
|
label1.clear();
|
|
}
|
|
debugPrint("Selected label: $label1, ${option.label}");
|
|
}
|
|
|
|
setState(() {
|
|
_dropDownValue3 = label1;
|
|
});
|
|
},
|
|
searchEnabled: true,
|
|
networkConfig: NetworkConfig(
|
|
url: '${Constants.url}/engagement',
|
|
method: RequestMethod.get,
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
},
|
|
),
|
|
chipConfig: const ChipConfig(wrapType: WrapType.wrap),
|
|
responseParser: (response) {
|
|
final list = (response as List<dynamic>).map((e) {
|
|
final item = e as Map<String, dynamic>;
|
|
return ValueItem(
|
|
label: item['relationship with chiesi'],
|
|
value: item['id'].toString(),
|
|
);
|
|
}).toList();
|
|
|
|
return Future.value(list);
|
|
},
|
|
responseErrorBuilder: ((context, body) {
|
|
return const Padding(
|
|
padding: EdgeInsets.all(16.0),
|
|
child: Text('Error fetching the data'),
|
|
);
|
|
}),
|
|
),
|
|
),
|
|
Padding(
|
|
padding: const EdgeInsets.all(8.0),
|
|
child: MultiSelectDropDown.network(
|
|
borderColor: Colors.black,
|
|
fieldBackgroundColor: Colors.transparent,
|
|
hint: "Select Level of Engagement",
|
|
dropdownHeight: 300,
|
|
onOptionSelected: (options) {
|
|
debugPrint(options.toString());
|
|
|
|
// String label = options[0].label.toString();
|
|
List<String> label1 = [];
|
|
|
|
// var label;
|
|
// debugPrint("checkking " + label);
|
|
//debugPrint("checkking " + label.isNotEmpty);
|
|
|
|
// if (label.isNotEmpty) {
|
|
for (var option in options) {
|
|
print("Options_isssssss: ${option}");
|
|
if (option.label.isNotEmpty) {
|
|
label1.add(option.label);
|
|
} else {
|
|
label1.clear();
|
|
}
|
|
debugPrint("Selected label: $label1, ${option.label}");
|
|
}
|
|
// } else {
|
|
// debugPrint("DESelected label: $label");
|
|
|
|
// label1.clear();
|
|
// }
|
|
|
|
setState(() {
|
|
_dropDownValue4 = label1;
|
|
});
|
|
},
|
|
searchEnabled: true,
|
|
networkConfig: NetworkConfig(
|
|
url: '${Constants.url}/engagement',
|
|
method: RequestMethod.get,
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
},
|
|
),
|
|
chipConfig: const ChipConfig(wrapType: WrapType.wrap),
|
|
responseParser: (response) {
|
|
final list = (response as List<dynamic>).map((e) {
|
|
final item = e as Map<String, dynamic>;
|
|
return ValueItem(
|
|
label: item['level of engagement'],
|
|
value: item['id'].toString(),
|
|
);
|
|
}).toList();
|
|
|
|
return Future.value(list);
|
|
},
|
|
responseErrorBuilder: ((context, body) {
|
|
return const Padding(
|
|
padding: EdgeInsets.all(16.0),
|
|
child: Text('Error fetching the data'),
|
|
);
|
|
}),
|
|
),
|
|
),
|
|
Padding(
|
|
padding: const EdgeInsets.all(8.0),
|
|
child: OutlinedButton(
|
|
onPressed: () {
|
|
print(
|
|
"$_dropDownValue1 , $_dropDownValue2, $_dropDownValue3, $_dropDownValue4");
|
|
|
|
filtermulti(_dropDownValue1, _dropDownValue2, _dropDownValue3,
|
|
_dropDownValue4, start, end);
|
|
// filtermulti(_dropDownValue1 ?? null, _dropDownValue2 ?? null,
|
|
// _dropDownValue3 ?? null, _dropDownValue4 ?? null);
|
|
|
|
// setState(() {
|
|
// // searchQuery = query;
|
|
|
|
// filteredList = eng
|
|
// .where((item) => item['level of engagement']
|
|
// .toLowerCase()
|
|
// .contains(_dropDownValue4!.toLowerCase())||
|
|
// item['relationship with chiesi'].toLowerCase().contains(_dropDownValue3!.toLowerCase()) ||
|
|
// item['main thereutic area'].toLowerCase().contains(_dropDownValue2!.toLowerCase())||
|
|
// item['recorded by'].toLowerCase().contains(_dropDownValue1!.toLowerCase()) )
|
|
// .toList();
|
|
// });
|
|
},
|
|
child: Text(
|
|
'Apply Filters',
|
|
style: TextStyle(color: Constants.k2color),
|
|
),
|
|
style: OutlinedButton.styleFrom(
|
|
shape: RoundedRectangleBorder(
|
|
borderRadius: BorderRadius.circular(12),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
//child: // Populate the Drawer in the next step.
|
|
),
|
|
body: Column(children: [
|
|
Padding(
|
|
padding: const EdgeInsets.only(
|
|
top: 15.0, bottom: 0.0, left: 20.0, right: 20.0),
|
|
child: Center(
|
|
child: TextField(
|
|
controller: _searchController,
|
|
onChanged: _filterList,
|
|
decoration: InputDecoration(
|
|
fillColor: Constants.k2color,
|
|
contentPadding: EdgeInsets.symmetric(vertical: 9.0),
|
|
border: OutlineInputBorder(),
|
|
labelText: ' Search',
|
|
prefixIcon: Icon(
|
|
Icons.search,
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
Scrollbar(
|
|
child: SingleChildScrollView(
|
|
scrollDirection: Axis.horizontal,
|
|
child: Container(
|
|
// width:
|
|
// MediaQuery.of(context)
|
|
// .size
|
|
// .width,
|
|
constraints:
|
|
BoxConstraints(minWidth: MediaQuery.of(context).size.width),
|
|
color: Colors.white,
|
|
child: DataTable(
|
|
showCheckboxColumn: false,
|
|
columns: const [
|
|
// DataColumn(
|
|
// label: Expanded(
|
|
// child: Text(
|
|
// '',
|
|
// softWrap:
|
|
// true))),
|
|
DataColumn(
|
|
label: Expanded(
|
|
child: Text(
|
|
'Main Therapeutic Area',
|
|
style: TextStyle(fontWeight: FontWeight.w600),
|
|
),
|
|
)),
|
|
// DataColumn(
|
|
// label: Expanded(
|
|
// child: Text(
|
|
// 'Department'))),
|
|
// DataColumn(
|
|
// label: Expanded(
|
|
// child: Text(
|
|
// 'Role'))),
|
|
DataColumn(
|
|
label: Expanded(
|
|
child: Text('Date',
|
|
style: TextStyle(fontWeight: FontWeight.w600)))),
|
|
// DataColumn(
|
|
// label: Expanded(
|
|
// child: Text(
|
|
// 'Org Type'))),
|
|
// DataColumn(
|
|
// label: Expanded(
|
|
// child: Text(
|
|
// 'Eng Type'))),
|
|
|
|
// Add more columns as needed
|
|
],
|
|
rows: List.generate(
|
|
filteredList.length,
|
|
(index) => DataRow(
|
|
onSelectChanged: (value) {
|
|
// =======> Use onSelectChanged for tab
|
|
// print("message ${eng[index]}");
|
|
|
|
// bsheet(
|
|
// publication_data[
|
|
// index]);
|
|
showModalBottomSheet(
|
|
useRootNavigator: true,
|
|
isScrollControlled: false,
|
|
enableDrag: true,
|
|
useSafeArea: true,
|
|
constraints: const BoxConstraints(
|
|
maxWidth: double.infinity,
|
|
),
|
|
shape: RoundedRectangleBorder(
|
|
borderRadius: BorderRadius.vertical(
|
|
top: Radius.circular(0),
|
|
),
|
|
),
|
|
clipBehavior: Clip.antiAliasWithSaveLayer,
|
|
context: context,
|
|
builder: (context) {
|
|
return bsheet(filteredList[index]);
|
|
},
|
|
);
|
|
// showBottomSheet(
|
|
// context:
|
|
// context,
|
|
// builder:
|
|
// (BuildContext
|
|
// context) {
|
|
// return bsheet(
|
|
// publication_data[
|
|
// index]); // returns your BottomSheet widget
|
|
// });
|
|
},
|
|
color: MaterialStateProperty.resolveWith<Color?>(
|
|
(Set<MaterialState> states) {
|
|
if (index.isEven) {
|
|
return Colors.grey.withOpacity(0.1);
|
|
}
|
|
return null;
|
|
}),
|
|
cells: [
|
|
DataCell(Text(
|
|
filteredList[index]['main thereutic area'].toString(),
|
|
softWrap: true)),
|
|
// DataCell(Text(
|
|
// affiliation_data[
|
|
// index]
|
|
// [
|
|
// 'dept']
|
|
// .toString(),
|
|
// softWrap:
|
|
// true)),
|
|
// DataCell(Text(
|
|
// affiliation_data[
|
|
// index]
|
|
// [
|
|
// 'role']
|
|
// .toString(),
|
|
// softWrap:
|
|
// true)),
|
|
DataCell(Text(filteredList[index]['date'].toString(),
|
|
softWrap: true)),
|
|
// DataCell(Text(
|
|
// affiliation_data[
|
|
// index]
|
|
// [
|
|
// 'org_type']
|
|
// .toString(),
|
|
// softWrap:
|
|
// true)),
|
|
// DataCell(Text(
|
|
// affiliation_data[
|
|
// index]
|
|
// [
|
|
// 'emg_type']
|
|
// .toString(),
|
|
// softWrap:
|
|
// true)),
|
|
|
|
// Add more DataCells as needed
|
|
],
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
]),
|
|
);
|
|
}
|
|
|
|
Future<Null> _selectDate(BuildContext context) async {
|
|
final DateTime? picked = await showDatePicker(
|
|
context: context,
|
|
initialDate: selectedDate,
|
|
firstDate: DateTime(1901, 1),
|
|
lastDate: DateTime(2100));
|
|
if (picked != null && picked != selectedDate) {
|
|
setState(() {
|
|
selectedDate = picked;
|
|
String convertedDateTime =
|
|
"${picked.day.toString().padLeft(2, '0')}-${picked.month.toString().padLeft(2, '0')}-${picked.year.toString()}";
|
|
// widget.textController.value = TextEditingValue(text: picked.toString());
|
|
startController.value = TextEditingValue(text: convertedDateTime);
|
|
// textController1.value = TextEditingValue(text: convertedDateTime);
|
|
|
|
start = convertedDateTime;
|
|
|
|
print("Iam__Start: $start");
|
|
});
|
|
}
|
|
}
|
|
|
|
Future<Null> _selectDate1(BuildContext context) async {
|
|
final DateTime? picked = await showDatePicker(
|
|
context: context,
|
|
initialDate: selectedDate,
|
|
firstDate: DateTime(1901, 1),
|
|
lastDate: DateTime(2100));
|
|
if (picked != null && picked != selectedDate) {
|
|
setState(() {
|
|
selectedDate = picked;
|
|
String convertedDateTime =
|
|
"${picked.day.toString().padLeft(2, '0')}-${picked.month.toString().padLeft(2, '0')}-${picked.year.toString()}";
|
|
// widget.textController.value = TextEditingValue(text: picked.toString());
|
|
endController.value = TextEditingValue(text: convertedDateTime);
|
|
|
|
end = convertedDateTime;
|
|
});
|
|
}
|
|
}
|
|
|
|
String _convertDateStringToISO(String dateString) {
|
|
DateTime dateTime = DateTime.parse(DateTime.tryParse(
|
|
dateString.split('/').reversed.join('-') + 'T00:00:00Z')!
|
|
.toIso8601String());
|
|
|
|
print("dateTimedateTime: $dateTime");
|
|
return dateTime.toIso8601String();
|
|
}
|
|
// List<String> filterList(List<String> list) {
|
|
// return list
|
|
// .where((item) => list.any((keyword) => item.contains(keyword)))
|
|
// .toList();
|
|
// }
|
|
}
|