You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

701 lines
30KB

  1. import 'dart:convert';
  2. import 'package:farm_tpf/custom_model/Media.dart';
  3. import 'package:farm_tpf/custom_model/Nursery.dart';
  4. import 'package:farm_tpf/custom_model/NurseryDetail.dart';
  5. import 'package:farm_tpf/data/api/app_exception.dart';
  6. import 'package:farm_tpf/data/repository/repository.dart';
  7. import 'package:farm_tpf/models/index.dart';
  8. import 'package:farm_tpf/presentation/custom_widgets/bloc/media_helper_bloc.dart';
  9. import 'package:farm_tpf/presentation/custom_widgets/widget_loading.dart';
  10. import 'package:farm_tpf/presentation/custom_widgets/widget_media_picker.dart';
  11. import 'package:farm_tpf/presentation/screens/actions/bloc/action_detail_bloc.dart';
  12. import 'package:farm_tpf/presentation/screens/actions/nursery/bloc/expansion_list_bloc.dart';
  13. import 'package:farm_tpf/presentation/screens/actions/state_management_helper/change_file_controller.dart';
  14. import 'package:farm_tpf/presentation/screens/actions/state_management_helper/change_supply.dart';
  15. import 'package:farm_tpf/presentation/screens/resources/sc_resource_helper.dart';
  16. import 'package:farm_tpf/utils/bloc/bloc/status_add_form_bloc.dart';
  17. import 'package:farm_tpf/utils/const_color.dart';
  18. import 'package:farm_tpf/utils/const_common.dart';
  19. import 'package:farm_tpf/utils/const_string.dart';
  20. import 'package:farm_tpf/utils/const_style.dart';
  21. import 'package:farm_tpf/utils/pref.dart';
  22. import 'package:farm_tpf/utils/validators.dart';
  23. import 'package:flutter/material.dart';
  24. import 'package:flutter_bloc/flutter_bloc.dart';
  25. import 'package:flutter_cache_manager/flutter_cache_manager.dart';
  26. import 'package:flutter_datetime_picker/flutter_datetime_picker.dart';
  27. import 'package:get/get.dart';
  28. import 'package:get/state_manager.dart';
  29. import 'package:intl/intl.dart';
  30. import 'package:keyboard_dismisser/keyboard_dismisser.dart';
  31. import 'package:mime/mime.dart';
  32. import 'package:pattern_formatter/pattern_formatter.dart';
  33. import 'package:farm_tpf/utils/formatter.dart';
  34. class EditActionNurseryScreen extends StatefulWidget {
  35. final int cropId;
  36. final bool isEdit;
  37. final int activityId;
  38. EditActionNurseryScreen(
  39. {@required this.cropId, this.isEdit = false, this.activityId});
  40. @override
  41. _EditActionNurseryState createState() => _EditActionNurseryState();
  42. }
  43. class _EditActionNurseryState extends State<EditActionNurseryScreen> {
  44. final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();
  45. final _repository = Repository();
  46. GlobalKey<FormState> _formKey = GlobalKey();
  47. bool _autoValidate = false;
  48. Nursery _nursery = Nursery();
  49. var pref = LocalPref();
  50. TextEditingController _substrateController = TextEditingController();
  51. TextEditingController _seedLengthController = TextEditingController();
  52. TextEditingController _quantityController = TextEditingController();
  53. TextEditingController _seedIncubationTimeController = TextEditingController();
  54. TextEditingController _descriptionController = TextEditingController();
  55. TextEditingController _workerNameController = TextEditingController();
  56. TextEditingController _trayNumberController = TextEditingController();
  57. String executeTimeView;
  58. DateTime executeTime = DateTime.now();
  59. List<NurseryDetail> currentNurseryDetail = List<NurseryDetail>();
  60. int currentIndexUpdate = -1;
  61. bool isResetForm = true;
  62. final changeSupply = Get.put(ChangeSupply());
  63. int selectedSupplyId = -1;
  64. List<String> filePaths = List<String>();
  65. var changeFileController = Get.put(ChangeFileController());
  66. @override
  67. void initState() {
  68. super.initState();
  69. changeSupply.initValue();
  70. changeFileController.initValue();
  71. _nursery.nurseryDetail = new List<NurseryDetail>();
  72. //UPDATE
  73. if (_nursery.id != null) {
  74. try {
  75. executeTime =
  76. DateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").parse(_nursery.executeDate);
  77. } catch (_) {}
  78. } else {
  79. //ADD NEW
  80. var parsedExecuteDate =
  81. DateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").format(executeTime);
  82. _nursery.executeDate = "$parsedExecuteDate";
  83. }
  84. executeTimeView = DateFormat("dd/MM/yyyy HH:mm").format(executeTime);
  85. _nursery.cropId = widget.cropId;
  86. }
  87. _validateInputs() async {
  88. if (_formKey.currentState.validate()) {
  89. _formKey.currentState.save();
  90. LoadingDialog.showLoadingDialog(context);
  91. _nursery.nurseryDetail = currentNurseryDetail;
  92. filePaths = Get.find<ChangeFileController>().files;
  93. var activityNursery = jsonEncode(_nursery.toJson()).toString();
  94. //ADD NEW
  95. if (_nursery.activityId == null) {
  96. _repository.createNursery((value) {
  97. LoadingDialog.hideLoadingDialog(context);
  98. Get.back();
  99. Get.snackbar(label_add_success, "Hoạt động ươm",
  100. snackPosition: SnackPosition.BOTTOM);
  101. }, (error) {
  102. LoadingDialog.hideLoadingDialog(context);
  103. _scaffoldKey.currentState.showSnackBar(SnackBar(
  104. content: Row(
  105. mainAxisAlignment: MainAxisAlignment.spaceBetween,
  106. children: <Widget>[
  107. Flexible(child: Text(AppException.handleError(error))),
  108. Icon(Icons.error),
  109. ],
  110. ),
  111. backgroundColor: Colors.red,
  112. duration: Duration(seconds: 3),
  113. ));
  114. }, activityNursery, filePaths: filePaths);
  115. } else {
  116. //UPDATE
  117. _repository.updateNursery((value) {
  118. LoadingDialog.hideLoadingDialog(context);
  119. Get.back();
  120. Get.snackbar(label_update_success, "Hoạt động ươm",
  121. snackPosition: SnackPosition.BOTTOM);
  122. }, (error) {
  123. LoadingDialog.hideLoadingDialog(context);
  124. _scaffoldKey.currentState.showSnackBar(SnackBar(
  125. content: Row(
  126. mainAxisAlignment: MainAxisAlignment.spaceBetween,
  127. children: <Widget>[
  128. Flexible(child: Text(AppException.handleError(error))),
  129. Icon(Icons.error),
  130. ],
  131. ),
  132. backgroundColor: Colors.red,
  133. duration: Duration(seconds: 3),
  134. ));
  135. }, activityNursery, filePaths: filePaths);
  136. }
  137. } else {
  138. _autoValidate = true;
  139. }
  140. }
  141. Widget _btnExecuteTimePicker() {
  142. return FlatButton(
  143. padding: EdgeInsets.only(top: 0.0, right: 0.0, bottom: 0.0, left: 0.0),
  144. onPressed: () {
  145. DatePicker.showDateTimePicker(context,
  146. showTitleActions: true, onChanged: (date) {}, onConfirm: (date) {
  147. setState(() {
  148. var parsedDate =
  149. DateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").format(date);
  150. _nursery.executeDate = "$parsedDate";
  151. executeTimeView = DateFormat("dd/MM/yyyy HH:mm").format(date);
  152. });
  153. }, currentTime: executeTime, locale: LocaleType.vi);
  154. },
  155. child: Container(
  156. padding:
  157. EdgeInsets.only(top: 0.0, right: 0.0, bottom: 10.5, left: 0.0),
  158. decoration: BoxDecoration(
  159. border: kBorderTextField,
  160. ),
  161. child: Row(
  162. children: [
  163. Expanded(
  164. child: Text(
  165. //TODO: check condition
  166. executeTimeView == null ? "$executeTime" : executeTimeView,
  167. style: TextStyle(fontSize: 14.0, color: Colors.black87),
  168. )),
  169. Icon(
  170. Icons.date_range,
  171. color: Colors.blue,
  172. ),
  173. ],
  174. )));
  175. }
  176. Widget _btnSelectSubstrates() {
  177. return FlatButton(
  178. padding: EdgeInsets.only(top: 0.0, right: 0.0, bottom: 0.0, left: 0.0),
  179. onPressed: () {
  180. Navigator.of(context)
  181. .push(MaterialPageRoute(
  182. builder: (_) => ResourceHelperScreen(
  183. titleName: "Giá thể",
  184. type: ConstCommon.supplyTypeSubStrate,
  185. selectedId: Get.find<ChangeSupply>().selectedSupplyId),
  186. fullscreenDialog: false))
  187. .then((value) {
  188. if (value != null) {
  189. var result = value as Supply;
  190. _nursery.substratesId = result.id;
  191. changeSupply.change(result);
  192. print("Home: $value");
  193. }
  194. });
  195. },
  196. child: Container(
  197. padding:
  198. EdgeInsets.only(top: 0.0, right: 0.0, bottom: 10.5, left: 0.0),
  199. decoration: BoxDecoration(
  200. border: kBorderTextField,
  201. ),
  202. child: Row(
  203. children: [
  204. GetBuilder<ChangeSupply>(
  205. builder: (_) => Expanded(
  206. child: Text(
  207. changeSupply.currentSupply.name == null
  208. ? "Loại giá thể"
  209. : changeSupply.currentSupply.name.toString(),
  210. style: TextStyle(
  211. fontSize: 14.0, color: Colors.black87)))),
  212. Icon(
  213. Icons.arrow_drop_down,
  214. color: Colors.grey,
  215. ),
  216. ],
  217. )));
  218. }
  219. Widget _seedLengthField() {
  220. return TextFormField(
  221. keyboardType: TextInputType.numberWithOptions(decimal: true),
  222. inputFormatters: [
  223. ThousandsFormatter(
  224. formatter: NumberFormat("#,###.##", "es"), allowFraction: true)
  225. ],
  226. decoration: InputDecoration(labelText: "Chiều dài mần"),
  227. controller: _seedLengthController,
  228. validator: (String value) {
  229. return Validators.validNumber(value, "Chiều dài mần");
  230. },
  231. onSaved: (newValue) {
  232. _nursery.seedLength = newValue.parseDoubleThousand();
  233. },
  234. );
  235. }
  236. Widget _quantityField() {
  237. return TextFormField(
  238. keyboardType: TextInputType.numberWithOptions(decimal: true),
  239. inputFormatters: [
  240. ThousandsFormatter(
  241. formatter: NumberFormat("#,###.##", "es"), allowFraction: true)
  242. ],
  243. decoration: InputDecoration(labelText: "Số lượng hạt gieo"),
  244. controller: _quantityController,
  245. validator: (String value) {
  246. return Validators.validNumber(value, "Số lượng hạt gieo");
  247. },
  248. onSaved: (newValue) {
  249. _nursery.quantity = newValue.parseDoubleThousand();
  250. },
  251. );
  252. }
  253. Widget _seedIncubationTimeField() {
  254. return TextFormField(
  255. keyboardType: TextInputType.numberWithOptions(decimal: true),
  256. inputFormatters: [
  257. ThousandsFormatter(
  258. formatter: NumberFormat("#,###.##", "es"), allowFraction: true)
  259. ],
  260. decoration: InputDecoration(labelText: "Thời gian ngâm hạt"),
  261. controller: _seedIncubationTimeController,
  262. validator: (String value) {
  263. return Validators.validNumber(value, "Thời gian ngâm hạt");
  264. },
  265. onSaved: (newValue) {
  266. _nursery.seedIncubationTime = newValue.parseDoubleThousand();
  267. },
  268. );
  269. }
  270. Widget _desciptionField() {
  271. return TextFormField(
  272. keyboardType: TextInputType.text,
  273. decoration: InputDecoration(labelText: "Ghi chú"),
  274. controller: _descriptionController,
  275. onSaved: (newValue) {
  276. _nursery.description = newValue;
  277. },
  278. );
  279. }
  280. Widget _btnAddWorker() {
  281. //TODO :check flow error sua item -> xoa list -> bam nut them
  282. return Builder(builder: (context) {
  283. return BlocConsumer<StatusAddFormBloc, StatusAddFormState>(
  284. listener: (context, state) {
  285. if (state is Edit) {
  286. isResetForm = false;
  287. _workerNameController.text = state.nurseryDetail.workerName;
  288. _trayNumberController.text = state.nurseryDetail.trayNumber;
  289. } else if (state is Delete) {
  290. if (currentIndexUpdate == state.index) {
  291. isResetForm = true;
  292. _workerNameController.text = "";
  293. _trayNumberController.text = "";
  294. }
  295. } else {
  296. isResetForm = true;
  297. _workerNameController.text = "";
  298. _trayNumberController.text = "";
  299. }
  300. }, builder: (context, state) {
  301. return Container(
  302. padding: EdgeInsets.all(8.0),
  303. decoration: BoxDecoration(
  304. shape: BoxShape.rectangle,
  305. borderRadius: BorderRadius.circular(10),
  306. color: Colors.white,
  307. border: Border.all(color: COLOR_CONST.DEFAULT)),
  308. child: Column(
  309. children: [
  310. TextFormField(
  311. keyboardType: TextInputType.text,
  312. controller: _workerNameController,
  313. decoration: InputDecoration(labelText: "Tên công nhân"),
  314. onSaved: (newValue) {},
  315. ),
  316. TextFormField(
  317. keyboardType: TextInputType.text,
  318. controller: _trayNumberController,
  319. decoration: InputDecoration(labelText: "Ươm khây số"),
  320. onSaved: (newValue) {},
  321. ),
  322. Align(
  323. alignment: Alignment.centerRight,
  324. child: Row(
  325. mainAxisAlignment: MainAxisAlignment.spaceBetween,
  326. children: [
  327. isResetForm
  328. ? Container()
  329. : OutlineButton(
  330. shape: RoundedRectangleBorder(
  331. borderRadius: new BorderRadius.circular(8.0)),
  332. child: Text("Huỷ"),
  333. onPressed: () {
  334. context.bloc<StatusAddFormBloc>().add(Reset());
  335. }),
  336. FlatButton(
  337. color: COLOR_CONST.DEFAULT,
  338. shape: RoundedRectangleBorder(
  339. borderRadius: new BorderRadius.circular(8.0)),
  340. onPressed: () {
  341. if (_workerNameController.text.isEmpty ||
  342. _trayNumberController.text.isEmpty) {
  343. return;
  344. }
  345. NurseryDetail _nurseryDetail = NurseryDetail()
  346. ..workerName = _workerNameController.text
  347. ..trayNumber = _trayNumberController.text;
  348. if (state is Edit) {
  349. context.bloc<ExpansionListBloc>().add(Update(
  350. index: state.index,
  351. item: _nurseryDetail,
  352. items: state.items));
  353. } else {
  354. currentNurseryDetail.insert(0, _nurseryDetail);
  355. BlocProvider.of<ExpansionListBloc>(context)
  356. .add(AddNew(items: currentNurseryDetail));
  357. }
  358. context.bloc<StatusAddFormBloc>().add(Reset());
  359. },
  360. child: Text(
  361. (state is Edit) ? "Sửa" : "Thêm",
  362. style: TextStyle(color: Colors.white),
  363. ))
  364. ],
  365. ),
  366. ),
  367. ],
  368. ));
  369. });
  370. });
  371. }
  372. Widget _buildListAddWorker() {
  373. return Builder(builder: (context) {
  374. return BlocBuilder<ExpansionListBloc, ExpansionListState>(
  375. builder: (context, state) {
  376. if (state is ExpansionListSuccess) {
  377. currentNurseryDetail = state.items;
  378. if (currentNurseryDetail.isEmpty) {
  379. return Container();
  380. }
  381. return Container(
  382. height: 70,
  383. child: ListView.builder(
  384. physics: ClampingScrollPhysics(),
  385. scrollDirection: Axis.horizontal,
  386. shrinkWrap: true,
  387. itemCount: currentNurseryDetail.length,
  388. itemBuilder: (context, index) {
  389. return GestureDetector(
  390. onTap: () {
  391. print("edit worker");
  392. currentIndexUpdate = index;
  393. context.bloc<StatusAddFormBloc>().add(Changed(
  394. status: CRUDStatus.edit,
  395. index: index,
  396. nurseryDetail: currentNurseryDetail[index],
  397. items: currentNurseryDetail));
  398. },
  399. child: Card(
  400. child: Stack(
  401. alignment: Alignment.bottomCenter,
  402. overflow: Overflow.visible,
  403. children: <Widget>[
  404. Positioned(
  405. child: ClipRRect(
  406. borderRadius: BorderRadius.circular(8),
  407. child: Container(
  408. padding: EdgeInsets.all(4),
  409. width: 120,
  410. child: Column(
  411. children: [
  412. SizedBox(
  413. height: 12.0,
  414. ),
  415. Flexible(
  416. child: Text(
  417. currentNurseryDetail[index]
  418. .workerName ??
  419. "",
  420. overflow: TextOverflow.ellipsis,
  421. maxLines: 1),
  422. ),
  423. Flexible(
  424. child: Text(currentNurseryDetail[index]
  425. .trayNumber ??
  426. ""))
  427. ],
  428. ),
  429. ),
  430. )),
  431. Positioned(
  432. top: -10,
  433. right: -10,
  434. child: IconButton(
  435. icon: Icon(
  436. Icons.cancel,
  437. color: Colors.redAccent,
  438. ),
  439. onPressed: () {
  440. print("Delete worker");
  441. context.bloc<ExpansionListBloc>().add(
  442. DeleteItem(
  443. index: index,
  444. items: currentNurseryDetail));
  445. context.bloc<StatusAddFormBloc>().add(
  446. Changed(
  447. status: CRUDStatus.delete,
  448. index: index,
  449. nurseryDetail:
  450. currentNurseryDetail[index],
  451. items: currentNurseryDetail));
  452. }),
  453. )
  454. ],
  455. )));
  456. }));
  457. } else if (state is ExpansionListFailure) {
  458. return Container();
  459. } else {
  460. return Container();
  461. }
  462. });
  463. });
  464. }
  465. _actionAppBar() {
  466. IconButton iconButton;
  467. if (1 == 1) {
  468. iconButton = IconButton(
  469. icon: Icon(
  470. Icons.done,
  471. color: Colors.black,
  472. ),
  473. onPressed: () {
  474. FocusScopeNode currentFocus = FocusScope.of(context);
  475. if (!currentFocus.hasPrimaryFocus) {
  476. currentFocus.unfocus();
  477. }
  478. _validateInputs();
  479. },
  480. );
  481. return <Widget>[iconButton];
  482. }
  483. return <Widget>[Container()];
  484. }
  485. @override
  486. Widget build(BuildContext context) => KeyboardDismisser(
  487. gestures: [
  488. GestureType.onTap,
  489. GestureType.onPanUpdateDownDirection,
  490. ],
  491. child: Scaffold(
  492. key: _scaffoldKey,
  493. appBar: AppBar(
  494. centerTitle: true,
  495. title: Text(plot_action_nursery),
  496. actions: _actionAppBar()),
  497. body: KeyboardDismisser(
  498. child: MultiBlocProvider(
  499. providers: [
  500. BlocProvider<ExpansionListBloc>(
  501. create: (context) => ExpansionListBloc(),
  502. ),
  503. BlocProvider<StatusAddFormBloc>(
  504. create: (context) => StatusAddFormBloc(),
  505. ),
  506. BlocProvider<ActionDetailBloc>(
  507. create: (context) =>
  508. ActionDetailBloc(repository: Repository())
  509. ..add(FetchData(
  510. isNeedFetchData: widget.isEdit,
  511. activityId: widget.activityId))),
  512. BlocProvider<MediaHelperBloc>(
  513. create: (context) =>
  514. MediaHelperBloc()..add(ChangeListMedia(items: [])),
  515. )
  516. ],
  517. child: Form(
  518. key: _formKey,
  519. autovalidate: _autoValidate,
  520. child: SingleChildScrollView(
  521. padding: EdgeInsets.all(8.0),
  522. child: BlocConsumer<ActionDetailBloc,
  523. ActionDetailState>(
  524. listener: (context, state) async {
  525. if (state is ActionDetailFailure) {
  526. print("fail");
  527. LoadingDialog.hideLoadingDialog(context);
  528. } else if (state is ActionDetailSuccess) {
  529. LoadingDialog.hideLoadingDialog(context);
  530. print("success");
  531. print(state.item);
  532. _nursery = Nursery.fromJson(state.item);
  533. _seedLengthController.text = _nursery
  534. .seedLength
  535. .formatNumtoStringDecimal();
  536. _quantityController.text = _nursery.quantity
  537. .formatNumtoStringDecimal();
  538. _seedIncubationTimeController.text = _nursery
  539. .seedIncubationTime
  540. .formatNumtoStringDecimal();
  541. _descriptionController.text =
  542. _nursery.description;
  543. try {
  544. executeTime =
  545. DateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'")
  546. .parse(_nursery.executeDate);
  547. } catch (_) {}
  548. executeTimeView =
  549. DateFormat("dd/MM/yyyy HH:mm")
  550. .format(executeTime);
  551. //Show media
  552. if (_nursery.media != null) {
  553. await cacheFiles(_nursery.media)
  554. .then((value) {
  555. print("then: ${value.length}");
  556. BlocProvider.of<MediaHelperBloc>(context)
  557. .add(ChangeListMedia(items: value));
  558. }).whenComplete(() {
  559. print("completed");
  560. });
  561. }
  562. //Show worker
  563. if (_nursery.nurseryDetail.length > 0) {
  564. BlocProvider.of<ExpansionListBloc>(context)
  565. .add(AddNew(
  566. items: _nursery.nurseryDetail));
  567. }
  568. //change subStrates
  569. if (_nursery.substratesId != null) {
  570. Get.find<ChangeSupply>()
  571. .changeById(_nursery.substratesId);
  572. }
  573. } else if (state is ActionDetailInitial) {
  574. print("init");
  575. } else if (state is ActionDetailLoading) {
  576. print("loading");
  577. LoadingDialog.showLoadingDialog(context);
  578. }
  579. },
  580. builder: (context, state) {
  581. return Column(
  582. children: <Widget>[
  583. Container(
  584. width: double.infinity,
  585. child: Text(
  586. "Ngày thực hiện",
  587. style: TextStyle(
  588. color: Colors.black54,
  589. fontSize: 13.0),
  590. ),
  591. ),
  592. _btnExecuteTimePicker(),
  593. SizedBox(
  594. height: 8.0,
  595. ),
  596. Container(
  597. width: double.infinity,
  598. child: Text(
  599. "Loại giá thể",
  600. style: TextStyle(
  601. color: Colors.black54,
  602. fontSize: 13.0),
  603. ),
  604. ),
  605. _btnSelectSubstrates(),
  606. SizedBox(
  607. height: 8.0,
  608. ),
  609. _seedLengthField(),
  610. SizedBox(
  611. height: 8.0,
  612. ),
  613. _quantityField(),
  614. SizedBox(
  615. height: 8.0,
  616. ),
  617. _seedIncubationTimeField(),
  618. SizedBox(
  619. height: 8.0,
  620. ),
  621. _desciptionField(),
  622. SizedBox(
  623. height: 8.0,
  624. ),
  625. _btnAddWorker(),
  626. SizedBox(
  627. height: 8.0,
  628. ),
  629. _buildListAddWorker(),
  630. SizedBox(
  631. height: 8.0,
  632. ),
  633. BlocBuilder<MediaHelperBloc,
  634. MediaHelperState>(
  635. builder: (context, state) {
  636. if (state is MediaHelperSuccess) {
  637. print("length: " +
  638. state.items.length.toString());
  639. return WidgetMediaPicker(
  640. currentItems: state.items,
  641. onChangeFiles: (filePaths) async {
  642. Get.find<ChangeFileController>()
  643. .addAllFile(filePaths);
  644. });
  645. } else {
  646. return Center(
  647. child: CircularProgressIndicator());
  648. }
  649. }),
  650. ],
  651. );
  652. },
  653. ),
  654. ))))));
  655. @override
  656. void dispose() {
  657. _substrateController.dispose();
  658. _seedLengthController.dispose();
  659. _quantityController.dispose();
  660. _seedIncubationTimeController.dispose();
  661. _descriptionController.dispose();
  662. super.dispose();
  663. }
  664. Future<List<Media>> cacheFiles(String existedMedias) async {
  665. var medias = List<Media>();
  666. var mediaPathsLocal = List<String>();
  667. var mediaPaths = existedMedias.split(";");
  668. for (int i = 0; i < mediaPaths.length; i++) {
  669. var tempFile = await DefaultCacheManager()
  670. .getSingleFile(ConstCommon.baseImageUrl + mediaPaths[i]);
  671. print(tempFile.path);
  672. var isVideo = lookupMimeType(tempFile.path) == "video/mp4";
  673. print("file type: " + lookupMimeType(tempFile.path));
  674. Media media = Media()
  675. ..pathFile = tempFile.path
  676. ..isVideo = isVideo;
  677. medias.add(media);
  678. mediaPathsLocal.add(tempFile.path);
  679. }
  680. Get.find<ChangeFileController>().addAllFile(filePaths);
  681. return medias;
  682. }
  683. }