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.

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