This commit is contained in:
Hamza-Ayed
2023-11-19 11:53:25 +03:00
parent 8e835f8c93
commit 63a6420531
18 changed files with 766 additions and 384 deletions

View File

@@ -48,6 +48,10 @@ class AppLink {
static const String addFeedBack = "$ride/feedBack/add.php"; static const String addFeedBack = "$ride/feedBack/add.php";
static const String getFeedBack = "$ride/feedBack/get.php"; static const String getFeedBack = "$ride/feedBack/get.php";
static const String updateFeedBack = "$ride/feedBack/updateFeedBack.php"; static const String updateFeedBack = "$ride/feedBack/updateFeedBack.php";
//-----------------license------------------
static const String addLicense = "$ride/license/add.php";
static const String getLicense = "$ride/license/get.php";
static const String updateLicense = "$ride/license/updateFeedBack.php";
//-----------------DriverOrder------------------ //-----------------DriverOrder------------------

View File

@@ -82,7 +82,7 @@ class LoginCaptinController extends GetxController {
'email': emailController.text, 'email': emailController.text,
'token': randomNumber.toString(), 'token': randomNumber.toString(),
}).then((value) => print(value)); }).then((value) => print(value));
Get.to(() => const VerifyEmailPage()); Get.to(() => VerifyEmailPage());
}, },
); );
} }

View File

@@ -0,0 +1,87 @@
import 'dart:convert';
import 'dart:io';
import 'dart:ui';
import 'package:get/get.dart';
import 'package:google_mlkit_text_recognition/google_mlkit_text_recognition.dart';
import 'package:image_picker/image_picker.dart';
class CarRegistrationRecognizerController extends GetxController {
@override
void onInit() {
// scanText();
super.onInit();
}
// The ImagePicker instance
final ImagePicker _imagePicker = ImagePicker();
Map extractedData = {};
// The GoogleMlKit TextRecognizer instance
final TextRecognizer _textRecognizer = TextRecognizer();
// The scanned text
String? scannedText;
String? jsonOutput;
final List<Map<String, dynamic>> lines = [];
XFile? image;
Map decode = {};
// Picks an image from the camera or gallery and extracts the text
final List<Map<String, dynamic>> extractedTextWithCoordinates = [];
Future<void> scanText() async {
// Pick an image from the camera or gallery
image = await _imagePicker.pickImage(source: ImageSource.gallery);
update();
// If no image was picked, return
if (image == null) {
return;
}
// Convert the XFile object to an InputImage object
final InputImage inputImage = InputImage.fromFile(File(image!.path));
// Recognize the text in the image
final RecognizedText recognizedText =
await _textRecognizer.processImage(inputImage);
scannedText = recognizedText.text;
final Map<String, dynamic> extractedData = {};
for (TextBlock block in recognizedText.blocks) {
for (TextLine line in block.lines) {
final String lineText = line.text;
final Rect lineBoundingBox = line.boundingBox!;
extractedTextWithCoordinates.add({
'text': lineText,
'boundingBox': {
'left': lineBoundingBox.left,
'top': lineBoundingBox.top,
'width': lineBoundingBox.width,
'height': lineBoundingBox.height,
},
});
}
update();
}
print(jsonEncode(extractedTextWithCoordinates));
// Extract the scanned text line by line
final List<Map<String, dynamic>> lines = [];
for (var i = 0; i < recognizedText.blocks.length; i++) {
lines.add({
i.toString(): recognizedText.blocks[i].text,
});
}
// print(jsonEncode(lines));
// Convert the list of lines to a JSON string
jsonOutput = jsonEncode(extractedData);
decode = jsonDecode(jsonOutput!);
update();
print('jsonOutput------------------------------');
print(decode);
// print(jsonEncode(lines));
}
}

View File

@@ -5,24 +5,34 @@ import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:ride/constant/links.dart'; import 'package:ride/constant/links.dart';
import 'package:ride/controller/functions/crud.dart'; import 'package:ride/controller/functions/crud.dart';
import 'package:ride/controller/functions/ocr_controller.dart';
import 'package:ride/views/auth/captin/login_captin.dart'; import 'package:ride/views/auth/captin/login_captin.dart';
import 'package:ride/views/auth/captin/verify_email_captain.dart';
import '../../../views/auth/captin/ai_page.dart';
import '../../../views/auth/verify_email_page.dart'; import '../../../views/auth/verify_email_page.dart';
class RegisterCaptinController extends GetxController { class RegisterCaptinController extends GetxController {
final formKey = GlobalKey<FormState>(); final formKey = GlobalKey<FormState>();
TextEditingController firstNameController = TextEditingController();
TextEditingController lastNameController = TextEditingController();
TextEditingController emailController = TextEditingController(); TextEditingController emailController = TextEditingController();
TextEditingController phoneController = TextEditingController(); TextEditingController phoneController = TextEditingController();
TextEditingController passwordController = TextEditingController(); TextEditingController passwordController = TextEditingController();
TextEditingController siteController = TextEditingController();
TextEditingController verifyCode = TextEditingController(); TextEditingController verifyCode = TextEditingController();
String birthDate = 'Birth Date'.tr; String birthDate = 'Birth Date'.tr;
String gender = 'Male'.tr; String gender = 'Male'.tr;
bool isloading = false; bool isLoading = false;
late String name;
late String licenseClass;
late String documentNo;
late String address;
late String height;
late String postalCode;
late String sex;
late String stateCode;
late String expireDate;
late String dob;
@override @override
void onInit() { void onInit() {
super.onInit(); super.onInit();
@@ -57,7 +67,7 @@ class RegisterCaptinController extends GetxController {
update(); update();
} }
sendverfications() async { sendVerifications() async {
var res = await CRUD().post(link: AppLink.verifyEmail, payload: { var res = await CRUD().post(link: AppLink.verifyEmail, payload: {
'email': emailController.text, 'email': emailController.text,
'token': verifyCode.text, 'token': verifyCode.text,
@@ -68,22 +78,70 @@ class RegisterCaptinController extends GetxController {
} }
} }
void register() async { void nextToAIDetection() async {
//Todo dont forget this
if (formKey.currentState!.validate()) { if (formKey.currentState!.validate()) {
isloading = true; isLoading = true;
update();
Get.to(() => AiPage());
}
}
Map<String, dynamic> payloadLisence = {};
void getFromController() {
name = Get.find<ScanDocumentsByApi>().name;
licenseClass = Get.find<ScanDocumentsByApi>().licenseClass.toString();
documentNo = Get.find<ScanDocumentsByApi>().documentNo.toString();
address = Get.find<ScanDocumentsByApi>().address.toString();
height = Get.find<ScanDocumentsByApi>().height.toString();
postalCode = Get.find<ScanDocumentsByApi>().address.toString();
sex = Get.find<ScanDocumentsByApi>().sex.toString();
stateCode = Get.find<ScanDocumentsByApi>().postalCode.toString();
expireDate = Get.find<ScanDocumentsByApi>().expireDate.toString();
dob = Get.find<ScanDocumentsByApi>().dob.toString();
update();
}
void addLisence() async {
getFromController();
var res = await CRUD().post(link: AppLink.addLicense, payload: {
'name': name,
'licenseClass': licenseClass,
'documentNo': documentNo,
'address': address,
'height': height,
'postalCode': postalCode,
'sex': sex == 'M' ? 'Male' : 'Female',
'stateCode': stateCode,
'expireDate': expireDate,
'dateOfBirth': dob,
});
print(jsonDecode(res));
isLoading = false;
update();
if (jsonDecode(res)['status'] == 'success') {
// Get.to(() => AiPage()); //todo rplace this
}
}
void register() async {
getFromController();
if (formKey.currentState!.validate()) {
isLoading = true;
update(); update();
var res = await CRUD().post(link: AppLink.signUpCaptin, payload: { var res = await CRUD().post(link: AppLink.signUpCaptin, payload: {
'first_name': firstNameController.text, 'first_name': name.split(' ')[1],
'last_name': lastNameController.text, 'last_name': name.split(' ')[0],
'email': emailController.text, 'email': emailController.text,
'phone': phoneController.text, 'phone': phoneController.text,
'password': passwordController.text, 'password': passwordController.text,
'gender': gender, 'gender': sex,
'site': siteController.text, 'site': address,
'birthdate': birthDate, 'birthdate': dob,
}); });
print(jsonDecode(res)); print(jsonDecode(res));
isloading = false; isLoading = false;
update(); update();
if (jsonDecode(res)['status'] == 'success') { if (jsonDecode(res)['status'] == 'success') {
print('sdfffffffffff'); print('sdfffffffffff');
@@ -92,7 +150,7 @@ class RegisterCaptinController extends GetxController {
'email': emailController.text, 'email': emailController.text,
'token': randomNumber.toString(), 'token': randomNumber.toString(),
}).then((value) => print(value)); }).then((value) => print(value));
Get.to(() => const VerifyEmailPage()); Get.to(() => VerifyEmailCaptainPage());
} }
} }
} }

View File

@@ -78,7 +78,7 @@ class LoginController extends GetxController {
'email': emailController.text, 'email': emailController.text,
'token': randomNumber.toString(), 'token': randomNumber.toString(),
}).then((value) => print(value)); }).then((value) => print(value));
Get.to(() => const VerifyEmailPage()); Get.to(() => VerifyEmailPage());
}, },
); );
} }

View File

@@ -61,8 +61,8 @@ class RegisterController extends GetxController {
'email': emailController.text, 'email': emailController.text,
'token': verfyCode.text, 'token': verfyCode.text,
}); });
var dec = jsonDecode(res);
if (jsonDecode(res)['status'] == 'success') { if (dec['status'] == 'success') {
Get.offAll(() => LoginPage()); Get.offAll(() => LoginPage());
} }
} }
@@ -87,7 +87,7 @@ class RegisterController extends GetxController {
'email': emailController.text, 'email': emailController.text,
'token': randomNumber.toString(), 'token': randomNumber.toString(),
}).then((value) => print(value)); }).then((value) => print(value));
Get.to(() => const VerifyEmailPage()); Get.to(() => VerifyEmailPage());
} }
} }
} }

View File

@@ -70,8 +70,8 @@ class CRUD {
'Basic ${base64Encode(utf8.encode(AppCredintials.basicAuthCredentials))}', 'Basic ${base64Encode(utf8.encode(AppCredintials.basicAuthCredentials))}',
}, },
); );
// print(response.request); print(response.request);
// print(payload); print(payload);
var jsonData = jsonDecode(response.body); var jsonData = jsonDecode(response.body);
if (response.statusCode == 200) { if (response.statusCode == 200) {
@@ -80,7 +80,7 @@ class CRUD {
jsonData['status'], jsonData['status'],
jsonData['message'], jsonData['message'],
); );
// print(response.body); print(response.body);
return response.body; return response.body;
} }
} }

View File

@@ -1,11 +1,13 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:io'; import 'dart:io';
import 'dart:typed_data'; import 'dart:typed_data';
import 'package:camera/camera.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:google_mlkit_text_recognition/google_mlkit_text_recognition.dart';
import 'package:image_picker/image_picker.dart'; import 'package:image_picker/image_picker.dart';
import 'package:http/http.dart' as http; import 'package:http/http.dart' as http;
import 'package:path/path.dart' as path;
import 'package:path_provider/path_provider.dart' as path_provider;
import 'package:ride/constant/box_name.dart'; import 'package:ride/constant/box_name.dart';
import 'package:ride/constant/colors.dart'; import 'package:ride/constant/colors.dart';
import 'package:ride/constant/credential.dart'; import 'package:ride/constant/credential.dart';
@@ -15,6 +17,7 @@ import 'package:ride/constant/table_names.dart';
import 'package:ride/main.dart'; import 'package:ride/main.dart';
import 'package:ride/views/widgets/elevated_btn.dart'; import 'package:ride/views/widgets/elevated_btn.dart';
import '../../constant/links.dart';
import '../../views/auth/captin/car_license_page.dart'; import '../../views/auth/captin/car_license_page.dart';
import 'launch.dart'; import 'launch.dart';
@@ -229,6 +232,56 @@ class ScanDocumentsByApi extends GetxController {
XFile? imageFace; XFile? imageFace;
late String imagePath; late String imagePath;
DateTime now = DateTime.now(); DateTime now = DateTime.now();
late String name;
late String licenseClass;
late String documentNo;
late String address;
late String stateCode;
late String height;
late String sex;
late String postalCode;
late String dob;
late String expireDate;
// ///////////////////////
// late CameraController cameraController;
// late List<CameraDescription> cameras;
// bool isCameraInitialized = false;
// // final TextRecognizer _textRecognizer = TextRecognizer();
// String? scannedText;
// Future<void> initializeCamera(int cameraID) async {
// try {
// cameras = await availableCameras();
// //update();
// cameraController = CameraController(
// cameras[cameraID],
// ResolutionPreset.medium,
// enableAudio: false,
// );
// await cameraController.initialize();
// isCameraInitialized = true;
// update();
// } catch (e) {
// if (e is CameraException) {
// switch (e.code) {
// case 'CameraAccessDenied':
// Get.defaultDialog(
// title: 'Camera Access Denied.'.tr,
// middleText: '',
// confirm:
// MyElevatedButton(title: 'Open Settings', onPressed: () {}),
// );
// break;
// default:
// // Handle other errors here.
// break;
// }
// }
// }
// }
///
Future<void> scanDocumentsByApi() async { Future<void> scanDocumentsByApi() async {
// Pick an image from the camera or gallery // Pick an image from the camera or gallery
@@ -252,6 +305,17 @@ class ScanDocumentsByApi extends GetxController {
if (response.statusCode == 200) { if (response.statusCode == 200) {
String responseString = await response.stream.bytesToString(); String responseString = await response.stream.bytesToString();
responseMap = jsonDecode(responseString); responseMap = jsonDecode(responseString);
var ocrData = responseMap['data']['ocr'];
name = ocrData['name'].toString();
licenseClass = ocrData['dlClass'].toString();
documentNo = ocrData['documentNumber'].toString();
address = ocrData['address'].toString();
height = ocrData['height'].toString();
postalCode = ocrData['addressPostalCode'].toString();
sex = ocrData['sex'].toString();
stateCode = ocrData['addressJurisdictionCode'].toString();
expireDate = ocrData['dateOfExpiry'].toString();
dob = ocrData['dateOfBirth'].toString();
if (responseMap['data'] != null && if (responseMap['data'] != null &&
responseMap['data']['image'] != null && responseMap['data']['image'] != null &&
responseMap['data']['image']['portrait'] != null) { responseMap['data']['image']['portrait'] != null) {
@@ -303,10 +367,9 @@ class ScanDocumentsByApi extends GetxController {
} else { } else {
if (times < 4) { if (times < 4) {
times++; times++;
matchFaceApi();
sql.updateData( sql.updateData(
{'faceDetectTimes': times}, TableName.faceDetectTimes, 1); {'faceDetectTimes': times}, TableName.faceDetectTimes, 1);
matchFaceApi();
} else { } else {
Get.defaultDialog( Get.defaultDialog(
barrierDismissible: false, barrierDismissible: false,
@@ -366,10 +429,11 @@ class ScanDocumentsByApi extends GetxController {
print(res); print(res);
update(); update();
res['data']['result'].toString() == 'No face detected in image2' res['data']['result'].toString().contains('No face detected in image')
? Get.defaultDialog( ? Get.defaultDialog(
barrierDismissible: false, barrierDismissible: false,
title: 'No face detected'.tr, title: 'No face detected'.tr,
middleText: ''.tr,
titleStyle: AppStyle.title, titleStyle: AppStyle.title,
confirm: MyElevatedButton( confirm: MyElevatedButton(
kolor: AppColor.yellowColor, kolor: AppColor.yellowColor,
@@ -417,12 +481,44 @@ class ScanDocumentsByApi extends GetxController {
print(response.reasonPhrase); print(response.reasonPhrase);
} }
} }
// Todo upload images and fields
Future<String> uploadImage(File imageFile) async {
var request = http.MultipartRequest(
'POST',
Uri.parse(AppLink.uploadImage),
);
// Attach the image file to the request
request.files.add(
await http.MultipartFile.fromPath('image', imageFile.path),
); // Add the headers to the request
request.headers.addAll({
"Content-Type": "application/x-www-form-urlencoded",
'Authorization':
'Basic ${base64Encode(utf8.encode(AppCredintials.basicAuthCredentials))}',
});
// Add the driverID to the request
request.fields['driverID'] = box.read(BoxName.driverID);
// Send the request
var response = await request.send();
// Read the response
var responseData = await response.stream.toBytes();
var responseString = String.fromCharCodes(responseData);
// scannedText = responseString;
update();
// Return the link received from the server
return responseString;
}
@override @override
void onInit() { void onInit() {
// scanDocumentsByApi(); // scanDocumentsByApi();
// initializeCamera(0);
sql.getAllData(TableName.faceDetectTimes).then((value) { sql.getAllData(TableName.faceDetectTimes).then((value) {
if (value.isEmpty || value == null) { if (value.isEmpty) {
print(value); print(value);
times = 0; times = 0;
print(times); print(times);
@@ -435,110 +531,7 @@ class ScanDocumentsByApi extends GetxController {
super.onInit(); super.onInit();
} }
} }
//
// class PassportRecognizerController extends GetxController {
// @override
// void onInit() {
// scanText();
// super.onInit();
// }
//
// // The ImagePicker instance
// final ImagePicker _imagePicker = ImagePicker();
// Map extractedData = {};
//
// // The GoogleMlKit TextRecognizer instance
// final TextRecognizer _textRecognizer = TextRecognizer();
//
// // The scanned text
// String? scannedText;
// String? jsonOutput;
// final List<Map<String, dynamic>> lines = [];
//
// Map decode = {};
// // Picks an image from the camera or gallery and extracts the text
//
// Future<void> scanText() async {
// // Pick an image from the camera or gallery
// final XFile? image =
// await _imagePicker.pickImage(source: ImageSource.gallery);
//
// // If no image was picked, return
// if (image == null) {
// return;
// }
//
// // Convert the XFile object to an InputImage object
// final InputImage inputImage = InputImage.fromFile(File(image.path));
//
// // Recognize the text in the image
// final RecognizedText recognizedText =
// await _textRecognizer.processImage(inputImage);
// scannedText = recognizedText.text;
// // Extract the scanned text line by line
// final List<Map<String, dynamic>> lines = [];
// for (var i = 0; i < recognizedText.blocks.length; i++) {
// lines.add({
// i.toString() +
// '_' +
// recognizedText.blocks[i].text.toString().split('\n')[0]:
// recognizedText.blocks[i].text,
// });
// }
// // for (var i = 0; i < recognizedText.blocks.length; i++) {
// // final block = recognizedText.blocks[i];
// for (final line in lines) {
// final key = line.keys.first;
// final value = line.values.first;
// if (line.values.contains('UNITED STATES OF')) {
// final title = line;
// extractedData['title'] = title;
// }
// if (line.values.contains('PASSPORT CARD')) {
// final passport = line;
// extractedData['passport'] = passport;
// }
// if (key == "7_Surname") {
// final nextItem = lines[lines.indexOf(line) + 1];
// extractedData['surname'] = nextItem.values.first;
// }
// if (key == "6_Nationality") {
// var nationality = value.split('\n')[1];
// extractedData['nationality'] = nationality;
// }
// if (key.contains('CARD')) {
// var passportCard = value;
// extractedData['passportCard'] = passportCard;
// }
// if (key.contains("9_Given")) {
// var givenNames = value.split('\n')[1];
// extractedData['givenNames'] = givenNames;
// }
// if (key.contains("13_Date of Birth")) {
// final parts = value.split('\n');
// if (parts.length > 1) {
// var dateOfBirth = parts[1];
// extractedData['dateOfBirth'] = dateOfBirth;
//
// var sex = parts[0].split(' ')[1];
// extractedData['sex'] = sex;
// }
// }
//
// // }
// }
//
// // Convert the list of lines to a JSON string
// jsonOutput = jsonEncode(extractedData);
// decode = jsonDecode(jsonOutput!);
//
// update();
// print('jsonOutput------------------------------');
// print(decode);
// // print(jsonEncode(lines));
// }
// }
//
// class PassportDataExtractor extends GetxController { // class PassportDataExtractor extends GetxController {
// @override // @override
// void onInit() { // void onInit() {

View File

@@ -43,9 +43,6 @@ void main() async {
List<Future> initializationTasks = [ List<Future> initializationTasks = [
FirebaseMessagesController().getNotificationSettings(), FirebaseMessagesController().getNotificationSettings(),
FirebaseMessagesController().getToken(), FirebaseMessagesController().getToken(),
// availableCameras(),
// FirebaseMessagesController().getTokens(),
// Add more initialization tasks here
]; ];
// cameras = await availableCameras(); // cameras = await availableCameras();
await Future.wait(initializationTasks); await Future.wait(initializationTasks);

View File

@@ -50,7 +50,7 @@ class AiPage extends StatelessWidget {
children: [ children: [
Container( Container(
decoration: AppStyle.boxDecoration, decoration: AppStyle.boxDecoration,
height: Get.height * .35, height: Get.height * .4,
child: Padding( child: Padding(
padding: const EdgeInsets.all(5), padding: const EdgeInsets.all(5),
child: scanDocumentsByApi.responseMap.isEmpty child: scanDocumentsByApi.responseMap.isEmpty
@@ -78,7 +78,7 @@ class AiPage extends StatelessWidget {
CrossAxisAlignment.start, CrossAxisAlignment.start,
children: [ children: [
Text( Text(
'Name :${scanDocumentsByApi.responseMap['data']['ocr']['name'].toString()}', 'Name :${scanDocumentsByApi.name}',
style: AppStyle.subtitle, style: AppStyle.subtitle,
), ),
Row( Row(
@@ -87,7 +87,7 @@ class AiPage extends StatelessWidget {
.spaceBetween, .spaceBetween,
children: [ children: [
Text( Text(
'Drivers License Class: ${scanDocumentsByApi.responseMap['data']['ocr']['dlClass'].toString()}', 'Drivers License Class: ${scanDocumentsByApi.licenseClass}',
style: AppStyle.title, style: AppStyle.title,
), ),
Image.memory( Image.memory(
@@ -108,7 +108,7 @@ class AiPage extends StatelessWidget {
.spaceBetween, .spaceBetween,
children: [ children: [
Text( Text(
'Document Number: ${scanDocumentsByApi.responseMap['data']['ocr']['documentNumber'].toString()}', 'Document Number: ${scanDocumentsByApi.documentNo}',
style: AppStyle.title, style: AppStyle.title,
), ),
Image.memory( Image.memory(
@@ -118,7 +118,7 @@ class AiPage extends StatelessWidget {
), ),
]), ]),
Text( Text(
'Address: ${scanDocumentsByApi.responseMap['data']['ocr']['address'].toString()}', 'Address: ${scanDocumentsByApi.address}',
style: AppStyle.title, style: AppStyle.title,
), ),
Row( Row(
@@ -127,21 +127,21 @@ class AiPage extends StatelessWidget {
.spaceBetween, .spaceBetween,
children: [ children: [
Text( Text(
'Height: ${scanDocumentsByApi.responseMap['data']['ocr']['height'].toString()}', 'Height: ${scanDocumentsByApi.height}',
style: AppStyle.subtitle, style: AppStyle.subtitle,
), ),
Text( Text(
'Postal Code: ${scanDocumentsByApi.responseMap['data']['ocr']['addressPostalCode'].toString()}', 'Postal Code: ${scanDocumentsByApi.postalCode}',
style: AppStyle.subtitle, style: AppStyle.subtitle,
), ),
Text( Text(
'Sex: ${scanDocumentsByApi.responseMap['data']['ocr']['sex'].toString()}', 'Sex: ${scanDocumentsByApi.sex}',
style: AppStyle.subtitle, style: AppStyle.subtitle,
), ),
], ],
), ),
Text( Text(
'Jurisdiction Code: ${scanDocumentsByApi.responseMap['data']['ocr']['addressJurisdictionCode'].toString()}', 'Territorial Code: ${scanDocumentsByApi.stateCode}',
style: AppStyle.subtitle, style: AppStyle.subtitle,
), ),
Row( Row(
@@ -150,7 +150,7 @@ class AiPage extends StatelessWidget {
.spaceBetween, .spaceBetween,
children: [ children: [
Text( Text(
'Expiry Date: ${scanDocumentsByApi.responseMap['data']['ocr']['dateOfExpiry'].toString()}', 'Expiry Date: ${scanDocumentsByApi.expireDate}',
style: DateTime.parse( style: DateTime.parse(
scanDocumentsByApi scanDocumentsByApi
.responseMap['data'] .responseMap['data']
@@ -168,7 +168,7 @@ class AiPage extends StatelessWidget {
.greenColor), .greenColor),
), ),
Text( Text(
'Date of Birth: ${scanDocumentsByApi.responseMap['data']['ocr']['dateOfBirth'].toString()}', 'Date of Birth: ${scanDocumentsByApi.dob}',
style: AppStyle.title, style: AppStyle.title,
), ),
], ],
@@ -207,7 +207,8 @@ class AiPage extends StatelessWidget {
) )
: const SizedBox(), : const SizedBox(),
MyElevatedButton( MyElevatedButton(
title: 'title', title: 'get sql data',
kolor: AppColor.yellowColor,
onPressed: () { onPressed: () {
// sql.deleteAllData(TableName.faceDetectTimes); // sql.deleteAllData(TableName.faceDetectTimes);
sql sql

View File

@@ -0,0 +1,83 @@
import 'package:camera/camera.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:ride/views/widgets/elevated_btn.dart';
import '../../../../constant/colors.dart';
import '../../../../constant/style.dart';
import '../../../../controller/functions/camer_controller.dart';
import '../../../../controller/functions/ocr_controller.dart';
import '../../../widgets/my_scafold.dart';
class CameraLisencePage extends StatelessWidget {
CameraLisencePage.CameraLicensePage({super.key});
final CameraClassController cameraClassController =
Get.put(CameraClassController());
@override
Widget build(BuildContext context) {
return MyScafolld(
title: 'Scan Driver License'.tr,
body: [
Column(children: [
Text(
'Please put your licence in these border'.tr,
style: AppStyle.title.copyWith(color: AppColor.greenColor),
),
Padding(
padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 12),
child: GetBuilder<CameraClassController>(
builder: (cameraClassController) =>
cameraClassController.isCameraInitialized
? Stack(
children: [
Container(
decoration: AppStyle.boxDecoration,
child: CameraPreview(
cameraClassController.cameraController,
),
),
Positioned(
top: Get.height * .1,
right: 5,
left: 5,
child: Container(
height: Get.width * 3 / 4,
width: Get.width * .9,
decoration: BoxDecoration(
// color: AppColor.blueColor,
border: Border.all(
color: AppColor.yellowColor, width: 2),
),
),
),
],
)
: Container(
decoration: AppStyle.boxDecoration,
height: Get.width * 3 / 4,
width: Get.width,
child: Center(
child: Text(
'Camera not initialized yet',
style: AppStyle.title,
),
),
),
),
),
const SizedBox(
height: 20,
),
MyElevatedButton(
title: 'Take Image'.tr,
onPressed: () {
ScanDocumentsByApi().scanDocumentsByApi();
},
)
]),
],
isleading: true,
);
}
}

View File

@@ -1,5 +1,9 @@
import 'dart:io';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:ride/controller/auth/captin/ml_google_doc.dart';
import 'package:ride/controller/auth/captin/register_captin_controller.dart';
import 'package:ride/views/widgets/my_scafold.dart'; import 'package:ride/views/widgets/my_scafold.dart';
import '../../../controller/functions/ocr_controller.dart'; import '../../../controller/functions/ocr_controller.dart';
@@ -7,7 +11,10 @@ import '../../widgets/elevated_btn.dart';
class CarLicensePage extends StatelessWidget { class CarLicensePage extends StatelessWidget {
CarLicensePage({super.key}); CarLicensePage({super.key});
ScanDocumentsByApi scanDocumentsByApi = Get.put(ScanDocumentsByApi()); CarRegistrationRecognizerController carRegistrationRecognizerController =
Get.put(CarRegistrationRecognizerController());
RegisterCaptinController registerCaptainController =
Get.put(RegisterCaptinController());
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@@ -20,11 +27,65 @@ class CarLicensePage extends StatelessWidget {
right: Get.width * .2, right: Get.width * .2,
child: MyElevatedButton( child: MyElevatedButton(
title: 'Take Picture Of ID Card'.tr, title: 'Take Picture Of ID Card'.tr,
onPressed: () { onPressed: () async {
scanDocumentsByApi.scanDocumentsByApi(); await carRegistrationRecognizerController.scanText();
},
)),
Positioned(
top: 50,
child: SizedBox(
height: Get.height * .7,
width: Get.width,
child: buildImageWithBoundingBoxes(),
),
),
Positioned(
bottom: 20,
left: Get.width * .2,
right: Get.width * .2,
child: MyElevatedButton(
title: 'Register'.tr,
onPressed: () async {
registerCaptainController.addLisence();
registerCaptainController.register();
}, },
)), )),
], ],
isleading: true); isleading: true);
} }
} }
Widget buildImageWithBoundingBoxes() {
CarRegistrationRecognizerController carRegistrationRecognizerController =
Get.put(CarRegistrationRecognizerController());
if (carRegistrationRecognizerController.image == null) {
return Text('No image selected');
} else {
return Stack(
children: [
Positioned(
// top: 50,
// right: 5,
// left: 5,
// bottom: 50,
child: Image.file(
File(carRegistrationRecognizerController.image!.path),
fit: BoxFit.fill,
)),
// for (var line
// in carRegistrationRecognizerController.extractedTextWithCoordinates)
// Positioned(
// left: line['boundingBox']['left'],
// top: line['boundingBox']['top'] - Get.width * 2,
// width: line['boundingBox']['width'],
// height: line['boundingBox']['height'],
// child: Container(
// decoration: BoxDecoration(
// border: Border.all(color: Colors.red, width: 2),
// ),
// ),
// ),
],
);
}
}

View File

@@ -8,6 +8,7 @@ import 'package:ride/constant/box_name.dart';
import 'package:ride/constant/colors.dart'; import 'package:ride/constant/colors.dart';
import 'package:ride/constant/info.dart'; import 'package:ride/constant/info.dart';
import 'package:ride/constant/style.dart'; import 'package:ride/constant/style.dart';
import 'package:ride/constant/table_names.dart';
import 'package:ride/controller/auth/captin/login_captin_controller.dart'; import 'package:ride/controller/auth/captin/login_captin_controller.dart';
import 'package:ride/main.dart'; import 'package:ride/main.dart';
import 'package:ride/views/auth/captin/register_captin.dart'; import 'package:ride/views/auth/captin/register_captin.dart';
@@ -190,7 +191,7 @@ class LoginCaptin extends StatelessWidget {
), ),
IconButton( IconButton(
onPressed: () { onPressed: () {
box.remove(BoxName.agreeTerms); sql.deleteAllData(TableName.faceDetectTimes);
}, },
icon: const Icon( icon: const Icon(
Icons.delete, Icons.delete,

View File

@@ -1,13 +1,11 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:ride/constant/style.dart';
import 'package:ride/controller/auth/captin/register_captin_controller.dart'; import 'package:ride/controller/auth/captin/register_captin_controller.dart';
import 'package:ride/views/auth/captin/car_license_page.dart';
import 'package:ride/views/widgets/elevated_btn.dart'; import 'package:ride/views/widgets/elevated_btn.dart';
import 'package:ride/views/widgets/my_scafold.dart'; import 'package:ride/views/widgets/my_scafold.dart';
import 'package:ride/views/widgets/mycircular.dart';
import '../../../constant/colors.dart'; import '../../../constant/colors.dart';
import 'ai_page.dart';
class RegisterCaptin extends StatelessWidget { class RegisterCaptin extends StatelessWidget {
const RegisterCaptin({super.key}); const RegisterCaptin({super.key});
@@ -16,7 +14,7 @@ class RegisterCaptin extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
Get.put(RegisterCaptinController()); Get.put(RegisterCaptinController());
return MyScafolld( return MyScafolld(
title: 'Register Captin'.tr, title: 'Register Captain'.tr,
body: [ body: [
GetBuilder<RegisterCaptinController>( GetBuilder<RegisterCaptinController>(
builder: (controller) => Form( builder: (controller) => Form(
@@ -37,250 +35,232 @@ class RegisterCaptin extends StatelessWidget {
child: Padding( child: Padding(
padding: const EdgeInsets.all(16), padding: const EdgeInsets.all(16),
child: Column(children: [ child: Column(children: [
Row( // Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, // mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ // children: [
SizedBox( // SizedBox(
width: Get.width * .4, // width: Get.width * .4,
child: TextFormField( // child: TextFormField(
keyboardType: TextInputType.text, // keyboardType: TextInputType.text,
controller: controller.firstNameController, // controller: controller.firstNameController,
decoration: InputDecoration( // decoration: InputDecoration(
focusedBorder: OutlineInputBorder( // focusedBorder: OutlineInputBorder(
borderSide: const BorderSide( // borderSide: const BorderSide(
color: AppColor.primaryColor, // color: AppColor.primaryColor,
width: 2.0, // width: 2.0,
), // ),
borderRadius: BorderRadius.circular(10), // borderRadius: BorderRadius.circular(10),
), // ),
fillColor: AppColor.accentColor, // fillColor: AppColor.accentColor,
hoverColor: AppColor.accentColor, // hoverColor: AppColor.accentColor,
focusColor: AppColor.accentColor, // focusColor: AppColor.accentColor,
border: const OutlineInputBorder( // border: const OutlineInputBorder(
borderRadius: BorderRadius.all( // borderRadius: BorderRadius.all(
Radius.circular(12))), // Radius.circular(12))),
labelText: 'First name'.tr, // labelText: 'First name'.tr,
hintText: 'Enter your first name'.tr, // hintText: 'Enter your first name'.tr,
// ),
// validator: (value) {
// if (value!.isEmpty) {
// return 'Please enter your first name.'.tr;
// }
// return null;
// },
// ),
// ),
// SizedBox(
// width: Get.width * .4,
// child: TextFormField(
// keyboardType: TextInputType.text,
// controller: controller.lastNameController,
// decoration: InputDecoration(
// focusedBorder: OutlineInputBorder(
// borderSide: const BorderSide(
// color: AppColor.primaryColor,
// width: 2.0,
// ),
// borderRadius: BorderRadius.circular(10),
// ),
// focusColor: AppColor.accentColor,
// fillColor: AppColor.accentColor,
// border: const OutlineInputBorder(
// borderRadius: BorderRadius.all(
// Radius.circular(12))),
// labelText: 'Last name'.tr,
// hintText: 'Enter your last name'.tr,
// ),
// validator: (value) {
// if (value!.isEmpty) {
// return 'Please enter your last name.'.tr;
// }
// return null;
// },
// ),
// ),
// ],
// ),
// const SizedBox(
// height: 15,
// ),
SizedBox(
width: Get.width * .8,
child: TextFormField(
keyboardType: TextInputType.emailAddress,
controller: controller.emailController,
decoration: InputDecoration(
focusedBorder: OutlineInputBorder(
borderSide: const BorderSide(
color: AppColor.primaryColor,
width: 2.0,
), ),
validator: (value) { borderRadius: BorderRadius.circular(10),
if (value!.isEmpty) {
return 'Please enter your first name.'.tr;
}
return null;
},
), ),
fillColor: AppColor.accentColor,
hoverColor: AppColor.accentColor,
focusColor: AppColor.accentColor,
border: const OutlineInputBorder(
borderRadius:
BorderRadius.all(Radius.circular(12))),
labelText: 'Email'.tr,
hintText: 'Enter your email address'.tr,
), ),
SizedBox( validator: (value) {
width: Get.width * .4, if (value!.isEmpty ||
child: TextFormField( (!value.contains('@') ||
keyboardType: TextInputType.text, !value.contains('.'))) {
controller: controller.lastNameController, return 'Please enter Your Email.'.tr;
decoration: InputDecoration( }
focusedBorder: OutlineInputBorder( return null;
borderSide: const BorderSide( },
color: AppColor.primaryColor,
width: 2.0,
),
borderRadius: BorderRadius.circular(10),
),
focusColor: AppColor.accentColor,
fillColor: AppColor.accentColor,
border: const OutlineInputBorder(
borderRadius: BorderRadius.all(
Radius.circular(12))),
labelText: 'Last name'.tr,
hintText: 'Enter your last name'.tr,
),
validator: (value) {
if (value!.isEmpty) {
return 'Please enter your last name.'.tr;
}
return null;
},
),
),
],
),
const SizedBox(
height: 15,
),
TextFormField(
keyboardType: TextInputType.emailAddress,
controller: controller.emailController,
decoration: InputDecoration(
focusedBorder: OutlineInputBorder(
borderSide: const BorderSide(
color: AppColor.primaryColor,
width: 2.0,
),
borderRadius: BorderRadius.circular(10),
),
fillColor: AppColor.accentColor,
hoverColor: AppColor.accentColor,
focusColor: AppColor.accentColor,
border: const OutlineInputBorder(
borderRadius:
BorderRadius.all(Radius.circular(12))),
labelText: 'Email'.tr,
hintText: 'Enter your email address'.tr,
), ),
validator: (value) {
if (value!.isEmpty ||
(!value.contains('@') ||
!value.contains('.'))) {
return 'Please enter Your Email.'.tr;
}
return null;
},
), ),
const SizedBox( const SizedBox(
height: 15, height: 15,
), ),
TextFormField( SizedBox(
obscureText: true, width: Get.width * .8,
keyboardType: TextInputType.emailAddress, child: TextFormField(
controller: controller.passwordController, obscureText: true,
decoration: InputDecoration( keyboardType: TextInputType.emailAddress,
focusedBorder: OutlineInputBorder( controller: controller.passwordController,
borderSide: const BorderSide( decoration: InputDecoration(
color: AppColor.primaryColor, focusedBorder: OutlineInputBorder(
width: 2.0, borderSide: const BorderSide(
color: AppColor.primaryColor,
width: 2.0,
),
borderRadius: BorderRadius.circular(10),
), ),
borderRadius: BorderRadius.circular(10), fillColor: AppColor.accentColor,
hoverColor: AppColor.accentColor,
focusColor: AppColor.accentColor,
border: const OutlineInputBorder(
borderRadius:
BorderRadius.all(Radius.circular(12))),
labelText: 'Password'.tr,
hintText: 'Enter your Password'.tr,
), ),
fillColor: AppColor.accentColor, validator: (value) {
hoverColor: AppColor.accentColor, if (value!.isEmpty) {
focusColor: AppColor.accentColor, return 'Please enter Your Password.'.tr;
border: const OutlineInputBorder( }
borderRadius: if (value.length < 6) {
BorderRadius.all(Radius.circular(12))), return 'Password must br at least 6 character.'
labelText: 'Password'.tr, .tr;
hintText: 'Enter your Password'.tr, }
return null;
},
), ),
validator: (value) {
if (value!.isEmpty || (value.length > 6)) {
return 'Please enter Your Password.'.tr;
}
return null;
},
), ),
const SizedBox( const SizedBox(
height: 15, height: 15,
), ),
Row( SizedBox(
mainAxisAlignment: MainAxisAlignment.spaceBetween, width: Get.width * .8,
children: [ child: TextFormField(
SizedBox( keyboardType: TextInputType.phone,
width: Get.width * .4, cursorColor: AppColor.accentColor,
child: TextFormField( controller: controller.phoneController,
keyboardType: TextInputType.phone, decoration: InputDecoration(
cursorColor: AppColor.accentColor, focusedBorder: OutlineInputBorder(
controller: controller.phoneController, borderSide: const BorderSide(
decoration: InputDecoration( color: AppColor.primaryColor,
focusedBorder: OutlineInputBorder( width: 2.0,
borderSide: const BorderSide(
color: AppColor.primaryColor,
width: 2.0,
),
borderRadius: BorderRadius.circular(10),
),
focusColor: AppColor.accentColor,
fillColor: AppColor.accentColor,
border: const OutlineInputBorder(
borderRadius: BorderRadius.all(
Radius.circular(12))),
labelText: 'Phone'.tr,
hintText: 'Enter your phone number'.tr,
), ),
validator: (value) { borderRadius: BorderRadius.circular(10),
if (value!.isEmpty || value.length != 10) {
return 'Please enter your phone number.'.tr;
}
return null;
},
), ),
focusColor: AppColor.accentColor,
fillColor: AppColor.accentColor,
border: const OutlineInputBorder(
borderRadius:
BorderRadius.all(Radius.circular(12))),
labelText: 'Phone'.tr,
hintText: 'Enter your phone number'.tr,
), ),
SizedBox( validator: (value) {
width: Get.width * .4, if (value!.isEmpty || value.length != 10) {
child: TextFormField( return 'Please enter your phone number.'.tr;
keyboardType: TextInputType.text, }
controller: controller.siteController, return null;
decoration: InputDecoration( },
focusedBorder: OutlineInputBorder( ),
borderSide: const BorderSide(
color: AppColor.primaryColor,
width: 2.0,
),
borderRadius: BorderRadius.circular(10),
),
focusColor: AppColor.accentColor,
fillColor: AppColor.accentColor,
border: const OutlineInputBorder(
borderRadius: BorderRadius.all(
Radius.circular(12))),
labelText: 'City'.tr,
hintText: 'Enter your City'.tr,
),
validator: (value) {
if (value!.isEmpty) {
return 'Please enter your City.'.tr;
}
return null;
},
),
),
],
), ),
const SizedBox( const SizedBox(
height: 15, height: 15,
), ),
Row( // Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, // mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ // children: [
InkWell( // InkWell(
onTap: () => controller.getBirthDate(), // onTap: () => controller.getBirthDate(),
child: Container( // child: Container(
height: 50, // height: 50,
width: Get.width * .4, // width: Get.width * .4,
decoration: BoxDecoration( // decoration: BoxDecoration(
border: Border.all(), // border: Border.all(),
borderRadius: BorderRadius.circular(13)), // borderRadius: BorderRadius.circular(13)),
child: Padding( // child: Padding(
padding: const EdgeInsets.symmetric( // padding: const EdgeInsets.symmetric(
horizontal: 20), // horizontal: 20),
child: Text( // child: Text(
controller.birthDate, // controller.birthDate,
style: AppStyle.title, // style: AppStyle.title,
), // ),
), // ),
), // ),
), // ),
DropdownButton( // DropdownButton(
value: controller.gender, // value: controller.gender,
items: [ // items: [
DropdownMenuItem( // DropdownMenuItem(
value: 'Male', // value: 'Male',
child: Text('Male'.tr), // child: Text('Male'.tr),
), // ),
DropdownMenuItem( // DropdownMenuItem(
value: 'Female', // value: 'Female',
child: Text('Female'.tr), // child: Text('Female'.tr),
), // ),
], // ],
onChanged: (value) { // onChanged: (value) {
controller.changeGender(value!); // controller.changeGender(value!);
}, // },
) // )
], // ],
), // ),
MyElevatedButton( MyElevatedButton(
title: 'Next'.tr, title: 'Next'.tr,
onPressed: () => Get.to(() => AiPage())), onPressed: () => controller.nextToAIDetection()),
controller.isloading MyElevatedButton(
? const MyCircularProgressIndicator() //todo remove it for test
: MyElevatedButton( title: 'Car registration ai '.tr,
title: 'Register Captain'.tr, kolor: AppColor.blueColor,
onPressed: () => controller.register()) onPressed: () => Get.to(() => CarLicensePage())),
// controller.isloading
// ? const MyCircularProgressIndicator()
// : MyElevatedButton(
// title: 'Register Captain'.tr,
// onPressed: () => controller.register())
]), ]),
), ),
), ),

View File

@@ -0,0 +1,91 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:ride/constant/colors.dart';
import 'package:ride/constant/style.dart';
import 'package:ride/controller/auth/captin/register_captin_controller.dart';
import 'package:ride/views/widgets/elevated_btn.dart';
import 'package:ride/views/widgets/my_scafold.dart';
class VerifyEmailCaptainPage extends StatelessWidget {
VerifyEmailCaptainPage({super.key});
RegisterCaptinController registerCaptinController =
Get.put(RegisterCaptinController());
@override
Widget build(BuildContext context) {
return MyScafolld(
title: 'Verify Email For Captain'.tr,
body: [
Positioned(
top: 10,
left: 20,
child: Text(
'We sent 5 digit to your Email provided'.tr,
style: AppStyle.title.copyWith(fontSize: 20),
)),
GetBuilder<RegisterCaptinController>(
builder: (controller) => Positioned(
top: 100,
left: 80,
right: 80,
child: Padding(
padding: const EdgeInsets.all(10),
child: Column(
children: [
SizedBox(
width: 100,
child: TextField(
controller: registerCaptinController.verifyCode,
decoration: InputDecoration(
labelStyle: AppStyle.title,
border: const OutlineInputBorder(),
hintText: '5 digit'.tr,
counterStyle: AppStyle.number,
hintStyle: AppStyle.subtitle
.copyWith(color: AppColor.accentColor),
),
maxLength: 5,
keyboardType: TextInputType.number,
),
),
const SizedBox(
height: 30,
),
MyElevatedButton(
title: 'Send Verfication Code'.tr,
onPressed: () {
registerCaptinController.sendVerifications();
})
],
),
),
)),
],
isleading: true,
);
}
Padding verifyEmail() {
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 10),
child: Container(
decoration: BoxDecoration(
border: Border.all(
color: AppColor.accentColor,
width: 2,
),
borderRadius: BorderRadius.circular(8),
),
child: const Padding(
padding: EdgeInsets.all(10),
child: SizedBox(
width: 20,
child: TextField(
maxLength: 1,
keyboardType: TextInputType.number,
),
),
),
),
);
}
}

View File

@@ -21,10 +21,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: archive name: archive
sha256: "0c8368c9b3f0abbc193b9d6133649a614204b528982bebc7026372d61677ce3a" sha256: "7b875fd4a20b165a3084bd2d210439b22ebc653f21cea4842729c0c30c82596b"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.3.7" version: "3.4.9"
args: args:
dependency: transitive dependency: transitive
description: description:
@@ -716,18 +716,18 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: google_mlkit_commons name: google_mlkit_commons
sha256: af63771903947d5523d9e991a939a4b8bf994f11661c9b9c8a71d7d3997115f8 sha256: "42173a8ba89f386486cc5b8249e84da4a4b861daa70498373627d985eb418689"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.2.0" version: "0.5.0"
google_mlkit_text_recognition: google_mlkit_text_recognition:
dependency: "direct main" dependency: "direct main"
description: description:
name: google_mlkit_text_recognition name: google_mlkit_text_recognition
sha256: "6dc31f02beb1cfd6818da4bf29bf4ae5f4f9e16422c1efd0b515ed0756d73b8e" sha256: "588021c99536fdfb173eeecc4ee1b60ea4e0bd4be9787f52363c85346ae20364"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.5.0" version: "0.10.0"
google_polyline_algorithm: google_polyline_algorithm:
dependency: "direct main" dependency: "direct main"
description: description:
@@ -809,13 +809,37 @@ packages:
source: hosted source: hosted
version: "4.0.2" version: "4.0.2"
image: image:
dependency: transitive dependency: "direct main"
description: description:
name: image name: image
sha256: a72242c9a0ffb65d03de1b7113bc4e189686fc07c7147b8b41811d0dd0e0d9bf sha256: "028f61960d56f26414eb616b48b04eb37d700cbe477b7fb09bf1d7ce57fd9271"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "4.0.17" version: "4.1.3"
image_cropper:
dependency: "direct main"
description:
name: image_cropper
sha256: "542c3453109d16bcc388e43ae2276044d2cd6a6d20c68bdcff2c94ab9363ea15"
url: "https://pub.dev"
source: hosted
version: "4.0.1"
image_cropper_for_web:
dependency: transitive
description:
name: image_cropper_for_web
sha256: "89c936aa772a35b69ca67b78049ae9fa163a4fb8da2f6dee3893db8883fb49d2"
url: "https://pub.dev"
source: hosted
version: "2.0.0"
image_cropper_platform_interface:
dependency: transitive
description:
name: image_cropper_platform_interface
sha256: b232175c132b2f7ede3e1f101652bcd635cb4079a77c6dded8e6d32e6578d685
url: "https://pub.dev"
source: hosted
version: "4.0.0"
image_picker: image_picker:
dependency: "direct main" dependency: "direct main"
description: description:

View File

@@ -40,11 +40,13 @@ dependencies:
flutter_font_icons: ^2.2.5 flutter_font_icons: ^2.2.5
device_info_plus: ^9.1.0 device_info_plus: ^9.1.0
image_picker: ^1.0.4 image_picker: ^1.0.4
google_mlkit_text_recognition: # ^0.10.0 google_mlkit_text_recognition: ^0.10.0
flutter_stripe: ^9.5.0+1 flutter_stripe: ^9.5.0+1
camera: ^0.10.5+5 camera: ^0.10.5+5
flutter_widget_from_html: ^0.14.6 flutter_widget_from_html: ^0.14.6
local_auth: ^2.1.7 local_auth: ^2.1.7
image: ^4.1.3
image_cropper: ^4.0.1