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.

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