Browse Source

action use water

master
daivph 5 years ago
parent
commit
2482a27470
8 changed files with 136 additions and 31 deletions
  1. +5
    -0
      lib/data/api/dio_provider.dart
  2. +4
    -0
      lib/data/api/rest_client.dart
  3. +20
    -0
      lib/data/api/rest_client.g.dart
  4. +10
    -0
      lib/data/repository/repository.dart
  5. +88
    -30
      lib/presentation/screens/actions/use_water/sc_edit_action_user_water.dart
  6. +1
    -1
      lib/utils/const_common.dart
  7. +7
    -0
      pubspec.lock
  8. +1
    -0
      pubspec.yaml

+ 5
- 0
lib/data/api/dio_provider.dart View File

@@ -1,6 +1,9 @@
import 'dart:convert';
import 'dart:developer';

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';

class DioProvider {
@@ -9,6 +12,8 @@ class DioProvider {

// dio.interceptors.add(AuthInterceptor());
dio.interceptors.add(HttpLogInterceptor());
dio.interceptors.add(
DioCacheManager(CacheConfig(baseUrl: ConstCommon.baseUrl)).interceptor);

return dio;
}

+ 4
- 0
lib/data/api/rest_client.dart View File

@@ -1,6 +1,7 @@
import 'package:dio/dio.dart';
import 'package:farm_tpf/custom_model/CropPlot.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/password.dart';
import 'package:farm_tpf/custom_model/user.dart';
@@ -47,6 +48,9 @@ abstract class RestClient {
@GET("/api/listActivityTypesOther")
Future<List<ActionType>> getActionTypes();

@GET("/api/water-types")
Future<List<WaterType>> getWaterTypes();

//Crop
@GET(
"/api/tb-crops-detail-for-app/{cropId}?page={page}&size={size}&sort=executeDate,DESC")

+ 20
- 0
lib/data/api/rest_client.g.dart View File

@@ -206,6 +206,26 @@ class _RestClient implements RestClient {
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
getCropDetail(cropId, {page = 0, size = 20}) async {
ArgumentError.checkNotNull(cropId, 'cropId');

+ 10
- 0
lib/data/repository/repository.dart View File

@@ -1,8 +1,10 @@
import 'dart:io';

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/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_request.dart';
import 'package:farm_tpf/data/api/app_exception.dart';
@@ -12,6 +14,7 @@ import 'package:farm_tpf/models/PagedResult.dart';
import 'package:farm_tpf/models/Supply.dart';
import 'package:farm_tpf/models/index.dart';
import 'package:farm_tpf/utils/const_common.dart';
import 'package:flutter/material.dart';

class Repository {
final dio = DioProvider.instance();
@@ -21,6 +24,13 @@ class Repository {
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}) {
final client = RestClient(dio);
return client.getCropDetail(cropId, page: page, size: size);

+ 88
- 30
lib/presentation/screens/actions/use_water/sc_edit_action_user_water.dart View File

@@ -43,6 +43,7 @@ class _EditActionUseWaterScreenState extends State<EditActionUseWaterScreen> {
bool _autoValidate = false;
UseWater _useWater = UseWater();
var pref = LocalPref();

TextEditingController _waterTypeController = TextEditingController();
TextEditingController _amountController = TextEditingController();
TextEditingController _descriptionController = TextEditingController();
@@ -51,11 +52,13 @@ class _EditActionUseWaterScreenState extends State<EditActionUseWaterScreen> {
DateTime executeTime = DateTime.now();
List<String> filePaths = List<String>();
var changeFileController = Get.put(ChangeFileController());
var changeRadio = Get.put(ChangeRadioButton());

@override
void initState() {
super.initState();
changeFileController.initValue();
changeRadio.init(widget.isEdit);
var parsedExecuteDate =
DateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").format(executeTime);
_useWater.executeDate = "$parsedExecuteDate";
@@ -197,34 +200,38 @@ class _EditActionUseWaterScreenState extends State<EditActionUseWaterScreen> {
}

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();
}
},
);
}

@@ -298,9 +305,13 @@ class _EditActionUseWaterScreenState extends State<EditActionUseWaterScreen> {
executeTime =
DateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'")
.parse(_useWater.executeDate);
executeTimeView = DateFormat("dd/MM/yyyy HH:mm")
.format(executeTime);
} catch (_) {}
executeTimeView = DateFormat("dd/MM/yyyy HH:mm")
.format(executeTime);

changeRadio
.initWithSelectedByName(_useWater.waterType);

//Show media
if (_useWater.media != null) {
await UtilAction.cacheFiles(_useWater.media)
@@ -370,3 +381,50 @@ class _EditActionUseWaterScreenState extends State<EditActionUseWaterScreen> {
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());
}
}
}

+ 1
- 1
lib/utils/const_common.dart View File

@@ -2,7 +2,7 @@ class ConstCommon {
static int kExpiredTime = 12 * 60 * 60 * 1000; //24h
static int kFileSize = 1000000; //1M = 1000.000 bytes
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 apiDetailCropStatus = "api/activity-crop-status";

+ 7
- 0
pubspec.lock View File

@@ -211,6 +211,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
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:
dependency: "direct main"
description:

+ 1
- 0
pubspec.yaml View File

@@ -20,6 +20,7 @@ dependencies:
flutter_bloc: ^6.0.1
equatable: ^1.2.0
dio: 3.0.9
dio_http_cache: ^0.2.9
formz: ^0.3.0
keyboard_dismisser: ^1.0.2
fluttertoast: ^6.0.1

Loading…
Cancel
Save