| import 'dart:convert'; | |||||
| import 'dart:developer'; | import 'dart:developer'; | ||||
| import 'package:dio/dio.dart'; | import 'package:dio/dio.dart'; | ||||
| import 'package:dio_http_cache/dio_http_cache.dart'; | |||||
| import 'package:farm_tpf/utils/const_common.dart'; | |||||
| import 'package:farm_tpf/utils/pref.dart'; | import 'package:farm_tpf/utils/pref.dart'; | ||||
| class DioProvider { | class DioProvider { | ||||
| // dio.interceptors.add(AuthInterceptor()); | // dio.interceptors.add(AuthInterceptor()); | ||||
| dio.interceptors.add(HttpLogInterceptor()); | dio.interceptors.add(HttpLogInterceptor()); | ||||
| dio.interceptors.add( | |||||
| DioCacheManager(CacheConfig(baseUrl: ConstCommon.baseUrl)).interceptor); | |||||
| return dio; | return dio; | ||||
| } | } |
| import 'package:dio/dio.dart'; | import 'package:dio/dio.dart'; | ||||
| import 'package:farm_tpf/custom_model/CropPlot.dart'; | import 'package:farm_tpf/custom_model/CropPlot.dart'; | ||||
| import 'package:farm_tpf/custom_model/Device.dart'; | import 'package:farm_tpf/custom_model/Device.dart'; | ||||
| import 'package:farm_tpf/custom_model/WaterType.dart'; | |||||
| import 'package:farm_tpf/custom_model/account.dart'; | import 'package:farm_tpf/custom_model/account.dart'; | ||||
| import 'package:farm_tpf/custom_model/password.dart'; | import 'package:farm_tpf/custom_model/password.dart'; | ||||
| import 'package:farm_tpf/custom_model/user.dart'; | import 'package:farm_tpf/custom_model/user.dart'; | ||||
| @GET("/api/listActivityTypesOther") | @GET("/api/listActivityTypesOther") | ||||
| Future<List<ActionType>> getActionTypes(); | Future<List<ActionType>> getActionTypes(); | ||||
| @GET("/api/water-types") | |||||
| Future<List<WaterType>> getWaterTypes(); | |||||
| //Crop | //Crop | ||||
| @GET( | @GET( | ||||
| "/api/tb-crops-detail-for-app/{cropId}?page={page}&size={size}&sort=executeDate,DESC") | "/api/tb-crops-detail-for-app/{cropId}?page={page}&size={size}&sort=executeDate,DESC") |
| return value; | return value; | ||||
| } | } | ||||
| @override | |||||
| getWaterTypes() async { | |||||
| const _extra = <String, dynamic>{}; | |||||
| final queryParameters = <String, dynamic>{}; | |||||
| final _data = <String, dynamic>{}; | |||||
| final Response<List<dynamic>> _result = await _dio.request( | |||||
| '/api/water-types', | |||||
| queryParameters: queryParameters, | |||||
| options: RequestOptions( | |||||
| method: 'GET', | |||||
| headers: <String, dynamic>{}, | |||||
| extra: _extra, | |||||
| baseUrl: baseUrl), | |||||
| data: _data); | |||||
| var value = _result.data | |||||
| .map((dynamic i) => WaterType.fromJson(i as Map<String, dynamic>)) | |||||
| .toList(); | |||||
| return value; | |||||
| } | |||||
| @override | @override | ||||
| getCropDetail(cropId, {page = 0, size = 20}) async { | getCropDetail(cropId, {page = 0, size = 20}) async { | ||||
| ArgumentError.checkNotNull(cropId, 'cropId'); | ArgumentError.checkNotNull(cropId, 'cropId'); |
| import 'dart:io'; | import 'dart:io'; | ||||
| import 'package:dio/dio.dart'; | import 'package:dio/dio.dart'; | ||||
| import 'package:dio_http_cache/dio_http_cache.dart'; | |||||
| import 'package:farm_tpf/custom_model/CropPlot.dart'; | import 'package:farm_tpf/custom_model/CropPlot.dart'; | ||||
| import 'package:farm_tpf/custom_model/Device.dart'; | import 'package:farm_tpf/custom_model/Device.dart'; | ||||
| import 'package:farm_tpf/custom_model/WaterType.dart'; | |||||
| import 'package:farm_tpf/custom_model/user.dart'; | import 'package:farm_tpf/custom_model/user.dart'; | ||||
| import 'package:farm_tpf/custom_model/user_request.dart'; | import 'package:farm_tpf/custom_model/user_request.dart'; | ||||
| import 'package:farm_tpf/data/api/app_exception.dart'; | import 'package:farm_tpf/data/api/app_exception.dart'; | ||||
| import 'package:farm_tpf/models/Supply.dart'; | import 'package:farm_tpf/models/Supply.dart'; | ||||
| import 'package:farm_tpf/models/index.dart'; | import 'package:farm_tpf/models/index.dart'; | ||||
| import 'package:farm_tpf/utils/const_common.dart'; | import 'package:farm_tpf/utils/const_common.dart'; | ||||
| import 'package:flutter/material.dart'; | |||||
| class Repository { | class Repository { | ||||
| final dio = DioProvider.instance(); | final dio = DioProvider.instance(); | ||||
| return client.getActionTypes(); | return client.getActionTypes(); | ||||
| } | } | ||||
| Future<List<WaterType>> getWaterTypes() { | |||||
| final client = RestClient(dio); | |||||
| var op = buildConfigurableCacheOptions( | |||||
| forceRefresh: true, maxAge: Duration(days: 7)); | |||||
| return client.getWaterTypes(); | |||||
| } | |||||
| Future<CropPlot> getPlotDetail(int cropId, {int page, int size}) { | Future<CropPlot> getPlotDetail(int cropId, {int page, int size}) { | ||||
| final client = RestClient(dio); | final client = RestClient(dio); | ||||
| return client.getCropDetail(cropId, page: page, size: size); | return client.getCropDetail(cropId, page: page, size: size); |
| bool _autoValidate = false; | bool _autoValidate = false; | ||||
| UseWater _useWater = UseWater(); | UseWater _useWater = UseWater(); | ||||
| var pref = LocalPref(); | var pref = LocalPref(); | ||||
| TextEditingController _waterTypeController = TextEditingController(); | TextEditingController _waterTypeController = TextEditingController(); | ||||
| TextEditingController _amountController = TextEditingController(); | TextEditingController _amountController = TextEditingController(); | ||||
| TextEditingController _descriptionController = TextEditingController(); | TextEditingController _descriptionController = TextEditingController(); | ||||
| DateTime executeTime = DateTime.now(); | DateTime executeTime = DateTime.now(); | ||||
| List<String> filePaths = List<String>(); | List<String> filePaths = List<String>(); | ||||
| var changeFileController = Get.put(ChangeFileController()); | var changeFileController = Get.put(ChangeFileController()); | ||||
| var changeRadio = Get.put(ChangeRadioButton()); | |||||
| @override | @override | ||||
| void initState() { | void initState() { | ||||
| super.initState(); | super.initState(); | ||||
| changeFileController.initValue(); | changeFileController.initValue(); | ||||
| changeRadio.init(widget.isEdit); | |||||
| var parsedExecuteDate = | var parsedExecuteDate = | ||||
| DateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").format(executeTime); | DateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").format(executeTime); | ||||
| _useWater.executeDate = "$parsedExecuteDate"; | _useWater.executeDate = "$parsedExecuteDate"; | ||||
| } | } | ||||
| Widget _typeWater() { | Widget _typeWater() { | ||||
| var waterTypes = List<WaterType>(); | |||||
| waterTypes.add(WaterType() | |||||
| ..waterTypeName = "name" | |||||
| ..waterTypeDescription = "description"); | |||||
| waterTypes.add(WaterType() | |||||
| ..waterTypeName = "name1" | |||||
| ..waterTypeDescription = "description1"); | |||||
| waterTypes.add(WaterType() | |||||
| ..waterTypeName = "name2" | |||||
| ..waterTypeDescription = "description2"); | |||||
| return Container( | |||||
| height: 150, | |||||
| child: ListView.builder( | |||||
| physics: NeverScrollableScrollPhysics(), | |||||
| shrinkWrap: true, | |||||
| itemBuilder: (context, index) { | |||||
| return GestureDetector( | |||||
| child: RadioListTile( | |||||
| title: Text(waterTypes[index].waterTypeDescription ?? ""), | |||||
| value: waterTypes[index], | |||||
| groupValue: 1 == 1 ? null : waterTypes[0], | |||||
| onChanged: (WaterType value) { | |||||
| print("selected value: ${value.waterTypeName}"); | |||||
| }), | |||||
| onTap: () {}); | |||||
| }, | |||||
| itemCount: waterTypes.length, | |||||
| ), | |||||
| return GetBuilder<ChangeRadioButton>( | |||||
| builder: (value) { | |||||
| if (value._waterTypes.length > 0) { | |||||
| return Container( | |||||
| height: 150, | |||||
| child: ListView.builder( | |||||
| physics: NeverScrollableScrollPhysics(), | |||||
| shrinkWrap: true, | |||||
| itemBuilder: (context, index) { | |||||
| return GestureDetector( | |||||
| child: RadioListTile( | |||||
| title: Text( | |||||
| value._waterTypes[index].waterTypeDescription ?? | |||||
| ""), | |||||
| value: value._waterTypes[index], | |||||
| groupValue: value.selectedWaterType == null | |||||
| ? null | |||||
| : value.selectedWaterType, | |||||
| onChanged: (WaterType value) { | |||||
| changeRadio.changeSelected(value); | |||||
| _useWater.waterType = value.waterTypeName; | |||||
| print("selected value: ${value.waterTypeName}"); | |||||
| }), | |||||
| onTap: () {}); | |||||
| }, | |||||
| itemCount: value._waterTypes.length, | |||||
| ), | |||||
| ); | |||||
| } else { | |||||
| return Container(); | |||||
| } | |||||
| }, | |||||
| ); | ); | ||||
| } | } | ||||
| executeTime = | executeTime = | ||||
| DateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'") | DateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'") | ||||
| .parse(_useWater.executeDate); | .parse(_useWater.executeDate); | ||||
| executeTimeView = DateFormat("dd/MM/yyyy HH:mm") | |||||
| .format(executeTime); | |||||
| } catch (_) {} | } catch (_) {} | ||||
| executeTimeView = DateFormat("dd/MM/yyyy HH:mm") | |||||
| .format(executeTime); | |||||
| changeRadio | |||||
| .initWithSelectedByName(_useWater.waterType); | |||||
| //Show media | //Show media | ||||
| if (_useWater.media != null) { | if (_useWater.media != null) { | ||||
| await UtilAction.cacheFiles(_useWater.media) | await UtilAction.cacheFiles(_useWater.media) | ||||
| super.dispose(); | super.dispose(); | ||||
| } | } | ||||
| } | } | ||||
| class ChangeRadioButton extends GetxController { | |||||
| List<WaterType> _waterTypes; | |||||
| WaterType selectedWaterType; | |||||
| Future<void> init(bool isEditScreen) async { | |||||
| //init if is NOT edit screen | |||||
| if (!isEditScreen) { | |||||
| selectedWaterType = WaterType(); | |||||
| _waterTypes = List<WaterType>(); | |||||
| //Get action types | |||||
| Repository _repo = Repository(); | |||||
| try { | |||||
| var response = await _repo.getWaterTypes(); | |||||
| if (response.length != null) { | |||||
| _waterTypes = response; | |||||
| update(); | |||||
| } | |||||
| } catch (error) { | |||||
| print(error.toString()); | |||||
| } | |||||
| } | |||||
| } | |||||
| void changeSelected(WaterType selected) { | |||||
| selectedWaterType = selected; | |||||
| update(); | |||||
| } | |||||
| //init and selected item | |||||
| Future<void> initWithSelectedByName(String waterTypeName) async { | |||||
| Repository _repo = Repository(); | |||||
| try { | |||||
| var response = await _repo.getWaterTypes(); | |||||
| if (response.length != null) { | |||||
| _waterTypes = response; | |||||
| _waterTypes.forEach((element) { | |||||
| if (element.waterTypeName == waterTypeName) { | |||||
| selectedWaterType = element; | |||||
| } | |||||
| }); | |||||
| update(); | |||||
| } | |||||
| } catch (error) { | |||||
| print(error.toString()); | |||||
| } | |||||
| } | |||||
| } |
| static int kExpiredTime = 12 * 60 * 60 * 1000; //24h | static int kExpiredTime = 12 * 60 * 60 * 1000; //24h | ||||
| static int kFileSize = 1000000; //1M = 1000.000 bytes | static int kFileSize = 1000000; //1M = 1000.000 bytes | ||||
| static const String baseUrl = "http://tpf.aztrace.vn"; | static const String baseUrl = "http://tpf.aztrace.vn"; | ||||
| static const String baseImageUrl = "http://s3.tpf.aztrace.vn/upload/"; | |||||
| static const String baseImageUrl = "http://s3tpf.aztrace.vn/upload/"; | |||||
| static const String apiDetailNursery = "api/activity-nursery"; | static const String apiDetailNursery = "api/activity-nursery"; | ||||
| static const String apiDetailCropStatus = "api/activity-crop-status"; | static const String apiDetailCropStatus = "api/activity-crop-status"; |
| url: "https://pub.dartlang.org" | url: "https://pub.dartlang.org" | ||||
| source: hosted | source: hosted | ||||
| version: "3.0.9" | version: "3.0.9" | ||||
| dio_http_cache: | |||||
| dependency: "direct main" | |||||
| description: | |||||
| name: dio_http_cache | |||||
| url: "https://pub.dartlang.org" | |||||
| source: hosted | |||||
| version: "0.2.9" | |||||
| equatable: | equatable: | ||||
| dependency: "direct main" | dependency: "direct main" | ||||
| description: | description: |
| flutter_bloc: ^6.0.1 | flutter_bloc: ^6.0.1 | ||||
| equatable: ^1.2.0 | equatable: ^1.2.0 | ||||
| dio: 3.0.9 | dio: 3.0.9 | ||||
| dio_http_cache: ^0.2.9 | |||||
| formz: ^0.3.0 | formz: ^0.3.0 | ||||
| keyboard_dismisser: ^1.0.2 | keyboard_dismisser: ^1.0.2 | ||||
| fluttertoast: ^6.0.1 | fluttertoast: ^6.0.1 |