@@ -1,18 +1,18 @@ | |||
# This is a generated file; do not edit or check into version control. | |||
connectivity_plus=/home/micbook/.pub-cache/hosted/pub.dev/connectivity_plus-2.3.9/ | |||
connectivity_plus_linux=/home/micbook/.pub-cache/hosted/pub.dev/connectivity_plus_linux-1.3.1/ | |||
connectivity_plus_macos=/home/micbook/.pub-cache/hosted/pub.dev/connectivity_plus_macos-1.2.6/ | |||
connectivity_plus_web=/home/micbook/.pub-cache/hosted/pub.dev/connectivity_plus_web-1.2.5/ | |||
connectivity_plus_windows=/home/micbook/.pub-cache/hosted/pub.dev/connectivity_plus_windows-1.2.2/ | |||
path_provider=/home/micbook/.pub-cache/hosted/pub.dev/path_provider-2.0.13/ | |||
path_provider_android=/home/micbook/.pub-cache/hosted/pub.dev/path_provider_android-2.0.23/ | |||
path_provider_foundation=/home/micbook/.pub-cache/hosted/pub.dev/path_provider_foundation-2.1.2/ | |||
path_provider_linux=/home/micbook/.pub-cache/hosted/pub.dev/path_provider_linux-2.1.9/ | |||
path_provider_windows=/home/micbook/.pub-cache/hosted/pub.dev/path_provider_windows-2.1.4/ | |||
shared_preferences=/home/micbook/.pub-cache/hosted/pub.dev/shared_preferences-2.0.18/ | |||
shared_preferences_android=/home/micbook/.pub-cache/hosted/pub.dev/shared_preferences_android-2.0.16/ | |||
shared_preferences_foundation=/home/micbook/.pub-cache/hosted/pub.dev/shared_preferences_foundation-2.1.4/ | |||
shared_preferences_linux=/home/micbook/.pub-cache/hosted/pub.dev/shared_preferences_linux-2.1.4/ | |||
shared_preferences_web=/home/micbook/.pub-cache/hosted/pub.dev/shared_preferences_web-2.0.5/ | |||
shared_preferences_windows=/home/micbook/.pub-cache/hosted/pub.dev/shared_preferences_windows-2.1.4/ | |||
sqflite=/home/micbook/.pub-cache/hosted/pub.dev/sqflite-2.2.5/ | |||
connectivity_plus=C:\\Users\\HP\\AppData\\Local\\Pub\\Cache\\hosted\\pub.dev\\connectivity_plus-2.3.9\\ | |||
connectivity_plus_linux=C:\\Users\\HP\\AppData\\Local\\Pub\\Cache\\hosted\\pub.dev\\connectivity_plus_linux-1.3.1\\ | |||
connectivity_plus_macos=C:\\Users\\HP\\AppData\\Local\\Pub\\Cache\\hosted\\pub.dev\\connectivity_plus_macos-1.2.6\\ | |||
connectivity_plus_web=C:\\Users\\HP\\AppData\\Local\\Pub\\Cache\\hosted\\pub.dev\\connectivity_plus_web-1.2.5\\ | |||
connectivity_plus_windows=C:\\Users\\HP\\AppData\\Local\\Pub\\Cache\\hosted\\pub.dev\\connectivity_plus_windows-1.2.2\\ | |||
path_provider=C:\\Users\\HP\\AppData\\Local\\Pub\\Cache\\hosted\\pub.dev\\path_provider-2.1.3\\ | |||
path_provider_android=C:\\Users\\HP\\AppData\\Local\\Pub\\Cache\\hosted\\pub.dev\\path_provider_android-2.2.4\\ | |||
path_provider_foundation=C:\\Users\\HP\\AppData\\Local\\Pub\\Cache\\hosted\\pub.dev\\path_provider_foundation-2.4.0\\ | |||
path_provider_linux=C:\\Users\\HP\\AppData\\Local\\Pub\\Cache\\hosted\\pub.dev\\path_provider_linux-2.2.1\\ | |||
path_provider_windows=C:\\Users\\HP\\AppData\\Local\\Pub\\Cache\\hosted\\pub.dev\\path_provider_windows-2.2.1\\ | |||
shared_preferences=C:\\Users\\HP\\AppData\\Local\\Pub\\Cache\\hosted\\pub.dev\\shared_preferences-2.2.3\\ | |||
shared_preferences_android=C:\\Users\\HP\\AppData\\Local\\Pub\\Cache\\hosted\\pub.dev\\shared_preferences_android-2.2.2\\ | |||
shared_preferences_foundation=C:\\Users\\HP\\AppData\\Local\\Pub\\Cache\\hosted\\pub.dev\\shared_preferences_foundation-2.4.0\\ | |||
shared_preferences_linux=C:\\Users\\HP\\AppData\\Local\\Pub\\Cache\\hosted\\pub.dev\\shared_preferences_linux-2.3.2\\ | |||
shared_preferences_web=C:\\Users\\HP\\AppData\\Local\\Pub\\Cache\\hosted\\pub.dev\\shared_preferences_web-2.3.0\\ | |||
shared_preferences_windows=C:\\Users\\HP\\AppData\\Local\\Pub\\Cache\\hosted\\pub.dev\\shared_preferences_windows-2.3.2\\ | |||
sqflite=C:\\Users\\HP\\AppData\\Local\\Pub\\Cache\\hosted\\pub.dev\\sqflite-2.3.3+1\\ |
@@ -6,3 +6,4 @@ | |||
!/.packages | |||
!/.flutter-plugins-dependencies | |||
!/.flutter-plugins | |||
.env |
@@ -28,7 +28,7 @@ if (flutterVersionName == null) { | |||
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" | |||
android { | |||
compileSdkVersion 33 | |||
compileSdkVersion 34 | |||
sourceSets { | |||
main.java.srcDirs += 'src/main/kotlin' | |||
@@ -26,6 +26,6 @@ subprojects { | |||
project.evaluationDependsOn(':app') | |||
} | |||
task clean(type: Delete) { | |||
tasks.register("clean", Delete) { | |||
delete rootProject.buildDir | |||
} |
@@ -5,5 +5,7 @@ class ImageConstant { | |||
static String imgEye = 'assets/images/img_eye.svg'; | |||
static String img1 = 'assets/images/img1.png'; | |||
static String imageNotFound = 'assets/images/image_not_found.png'; | |||
} |
@@ -21,8 +21,8 @@ get width { | |||
///This method is used to get device viewport height. | |||
get height { | |||
num statusBar = | |||
MediaQueryData.fromWindow(WidgetsBinding.instance.window).viewPadding.top; | |||
num bottomBar = MediaQueryData.fromWindow(WidgetsBinding.instance.window) | |||
MediaQueryData.fromView(WidgetsBinding.instance.window).viewPadding.top; | |||
num bottomBar = MediaQueryData.fromView(WidgetsBinding.instance.window) | |||
.viewPadding | |||
.bottom; | |||
num screenHeight = size.height - statusBar - bottomBar; | |||
@@ -4,13 +4,15 @@ import 'package:flutter/services.dart'; | |||
import 'core/app_export.dart'; | |||
import 'package:flutter_dotenv/flutter_dotenv.dart'; | |||
void main() { | |||
WidgetsFlutterBinding.ensureInitialized(); | |||
SystemChrome.setPreferredOrientations([ | |||
DeviceOrientation.portraitUp, | |||
]).then((value) { | |||
Logger.init(kReleaseMode ? LogMode.live : LogMode.debug); | |||
runApp(MyApp()); | |||
]).then((value){ | |||
Logger.init(kReleaseMode ? LogMode.live : LogMode.debug); | |||
runApp(MyApp()); | |||
}); | |||
} | |||
@@ -0,0 +1,253 @@ | |||
import 'package:flutter/material.dart'; | |||
import 'package:http/http.dart' as http; | |||
import 'dart:convert'; | |||
import 'dart:io'; | |||
import 'package:http/io_client.dart'; | |||
class CameraPage extends StatelessWidget { | |||
final String loginUrl = 'https://192.168.60.230:5050/auth/login'; | |||
final String moveCameraUrl = 'https://192.168.60.230:5050/move-camera'; | |||
Future<http.Client> createHttpClient() async { | |||
final ioc = HttpClient() | |||
..badCertificateCallback = | |||
(X509Certificate cert, String host, int port) => true; | |||
return IOClient(ioc); | |||
} | |||
Future<String> loginAndGetToken(http.Client client) async { | |||
var url = Uri.parse(loginUrl); | |||
var data = {'username': 'admin', 'password': 'Pwdadmin1!'}; | |||
var body = data.keys | |||
.map((key) => | |||
"${Uri.encodeComponent(key)}=${Uri.encodeComponent(data[key] ?? '')}") | |||
.join("&"); | |||
var response = await client.post( | |||
url, | |||
headers: { | |||
"Content-Type": "application/x-www-form-urlencoded", | |||
}, | |||
body: body, | |||
); | |||
var responseBody = response.body; | |||
var parsedJson = jsonDecode(responseBody); | |||
if (parsedJson['access_token'] != null) { | |||
return parsedJson['access_token']; | |||
} else { | |||
throw Exception('Token not found in response'); | |||
} | |||
} | |||
Future<void> sendPostRequestMoveCamera( | |||
BuildContext context, String token, Map<String, dynamic> data) async { | |||
var url = Uri.parse(moveCameraUrl); | |||
var jsonData = jsonEncode(data); | |||
HttpClient httpClient = HttpClient() | |||
..badCertificateCallback = | |||
((X509Certificate cert, String host, int port) => true); | |||
var request = await httpClient.postUrl(url) | |||
..headers.contentType = ContentType.json | |||
..headers.add('Authorization', 'Bearer $token') | |||
..write(jsonData); | |||
var response = await request.close(); | |||
var responseBody = await utf8.decodeStream(response); | |||
var responseJson = jsonDecode(responseBody); | |||
var message = responseJson['message'] ?? 'Unknown response'; | |||
bool isError = message.startsWith('Error:') || message.startsWith('Errore:'); | |||
ScaffoldMessenger.of(context).showSnackBar( | |||
SnackBar( | |||
content: Text(message), | |||
backgroundColor: isError ? Colors.red : Colors.green, | |||
), | |||
); | |||
} | |||
@override | |||
Widget build(BuildContext context) { | |||
double screenWidth = MediaQuery.of(context).size.width; | |||
return Scaffold( | |||
body: OrientationBuilder( | |||
builder: (context, orientation) => Stack( | |||
children: [ | |||
Column( | |||
children: [ | |||
Expanded( | |||
child: Builder( | |||
builder: (context) => GestureDetector( | |||
onTap: () async { | |||
final client = await createHttpClient(); | |||
String token = await loginAndGetToken(client); | |||
await sendPostRequestMoveCamera(context, token, { | |||
"baseUrl": "HTTP://10.1.1.66:2000", | |||
"username": "admin", | |||
"password": "Adminadmin1", | |||
"preset": 1 | |||
}); | |||
}, | |||
child: Stack( | |||
children: [ | |||
Container( | |||
color: Colors.transparent, | |||
child: Transform.rotate( | |||
angle: 3.14 / 2, | |||
child: Image.asset( | |||
'assets/images/img1.png', | |||
fit: BoxFit.cover, | |||
), | |||
), | |||
), | |||
], | |||
), | |||
), | |||
), | |||
), | |||
Expanded( | |||
child: Builder( | |||
builder: (context) => GestureDetector( | |||
onTap: () async { | |||
final client = await createHttpClient(); | |||
String token = await loginAndGetToken(client); | |||
await sendPostRequestMoveCamera(context, token, { | |||
"baseUrl": "HTTP://10.1.1.66:2000", | |||
"username": "admin", | |||
"password": "Adminadmin1", | |||
"preset": 3 | |||
}); | |||
}, | |||
child: Stack( | |||
children: [ | |||
Container( | |||
color: Colors.transparent, | |||
child: Transform.rotate( | |||
angle: 3.14 / 2, | |||
child: Image.asset( | |||
'assets/images/img2.png', | |||
fit: BoxFit.cover, | |||
), | |||
), | |||
), | |||
], | |||
), | |||
), | |||
), | |||
), | |||
Expanded( | |||
child: Builder( | |||
builder: (context) => GestureDetector( | |||
onTap: () async { | |||
final client = await createHttpClient(); | |||
String token = await loginAndGetToken(client); | |||
await sendPostRequestMoveCamera(context, token, { | |||
"baseUrl": "HTTP://10.1.1.66:2000", | |||
"username": "admin", | |||
"password": "Adminadmin1", | |||
"preset": 2 | |||
}); | |||
}, | |||
child: Stack( | |||
children: [ | |||
Container( | |||
color: Colors.transparent, | |||
child: Transform.rotate( | |||
angle: 3.14 / 2, | |||
child: Image.asset( | |||
'assets/images/img3.png', | |||
fit: BoxFit.cover, | |||
), | |||
), | |||
), | |||
], | |||
), | |||
), | |||
), | |||
), | |||
], | |||
), | |||
Positioned( | |||
top: 110.0, | |||
right: 350.0, | |||
child: GestureDetector( | |||
onTap: () async { | |||
final client = await createHttpClient(); | |||
String token = await loginAndGetToken(client); | |||
await sendPostRequestMoveCamera(context, token, { | |||
"baseUrl": "HTTP://10.1.1.66:2000", | |||
"username": "admin", | |||
"password": "Adminadmin1", | |||
"preset": 5 | |||
}); | |||
}, | |||
child: Transform.rotate( | |||
angle: 3.14 / 2, // Rotating 90 degrees (PI / 2 radians) | |||
child: FaceSymbol(), | |||
), | |||
), | |||
), | |||
Positioned( | |||
top: 350.0, | |||
right: 350.0, | |||
child: GestureDetector( | |||
onTap: () async { | |||
final client = await createHttpClient(); | |||
String token = await loginAndGetToken(client); | |||
await sendPostRequestMoveCamera(context, token, { | |||
"baseUrl": "HTTP://10.1.1.66:2000", | |||
"username": "admin", | |||
"password": "Adminadmin1", | |||
"preset": 4 | |||
}); | |||
}, | |||
child: Transform.rotate( | |||
angle: 3.14 / 2, // Rotating 90 degrees (PI / 2 radians) | |||
child: FaceSymbol(), | |||
), | |||
), | |||
), | |||
Positioned( | |||
top: 700.0, | |||
right: 350.0, | |||
child: GestureDetector( | |||
onTap: () async { | |||
final client = await createHttpClient(); | |||
String token = await loginAndGetToken(client); | |||
await sendPostRequestMoveCamera(context, token, { | |||
"baseUrl": "HTTP://10.1.1.66:2000", | |||
"username": "admin", | |||
"password": "Adminadmin1", | |||
"preset": 6 | |||
}); | |||
}, | |||
child: Transform.rotate( | |||
angle: 3.14 / 2, // Rotating 90 degrees (PI / 2 radians) | |||
child: FaceSymbol(), | |||
), | |||
), | |||
), | |||
], | |||
), | |||
), | |||
); | |||
} | |||
} | |||
class FaceSymbol extends StatelessWidget { | |||
@override | |||
Widget build(BuildContext context) { | |||
return Icon( | |||
Icons.face, // Using a built-in face icon | |||
size: 50.0, | |||
color: Colors.blue, | |||
); | |||
} | |||
} |
@@ -1,166 +1,449 @@ | |||
import 'controller/login_controller.dart'; | |||
import 'dart:async'; | |||
import 'dart:convert'; | |||
import 'dart:io'; | |||
import 'dart:ui' as ui; | |||
import 'package:flutter/cupertino.dart'; | |||
import 'package:flutter/material.dart'; | |||
import 'package:michele_s_application8/core/app_export.dart'; | |||
import 'package:michele_s_application8/core/utils/validation_functions.dart'; | |||
import 'package:get/get.dart'; | |||
import 'package:michele_s_application8/widgets/custom_button.dart'; | |||
import 'package:michele_s_application8/widgets/custom_text_form_field.dart'; | |||
import 'package:http/http.dart' as http; | |||
import 'package:michele_s_application8/presentation/camera_page/camera_page.dart'; | |||
// ignore_for_file: must_be_immutable | |||
class LoginScreen extends GetWidget<LoginController> { | |||
import 'package:flutter_dotenv/flutter_dotenv.dart'; | |||
class LoginScreen extends StatefulWidget { | |||
@override | |||
_LoginScreenState createState() => _LoginScreenState(); | |||
} | |||
class _LoginScreenState extends State<LoginScreen> { | |||
GlobalKey<FormState> _formKey = GlobalKey<FormState>(); | |||
final TextEditingController _timeController1 = TextEditingController(); | |||
final TextEditingController _titleController = TextEditingController(); | |||
final TextEditingController _presenterNameController = TextEditingController(); | |||
final TextEditingController _camNumberController = TextEditingController(text: '1'); | |||
late TextEditingController _languageController; | |||
bool isRecording = false; | |||
bool isLoading = false; | |||
bool isError = false; | |||
bool showStartRecordingButton = true; | |||
Timer? _recordingTimer; | |||
@override | |||
void initState() { | |||
super.initState(); | |||
String deviceLanguage = ui.window.locale.languageCode; | |||
String language = (deviceLanguage == 'en') ? 'EN' : (deviceLanguage == 'it') ? 'IT' : 'IT'; | |||
_languageController = TextEditingController(text: language); | |||
} | |||
@override | |||
void dispose() { | |||
_recordingTimer?.cancel(); | |||
super.dispose(); | |||
} | |||
@override | |||
Widget build(BuildContext context) { | |||
return SafeArea( | |||
child: Scaffold( | |||
resizeToAvoidBottomInset: false, | |||
backgroundColor: ColorConstant.whiteA700, | |||
body: Form( | |||
key: _formKey, | |||
child: Container( | |||
width: double.maxFinite, | |||
padding: | |||
getPadding(left: 23, top: 11, right: 23, bottom: 11), | |||
child: Column( | |||
crossAxisAlignment: CrossAxisAlignment.start, | |||
mainAxisAlignment: MainAxisAlignment.start, | |||
children: [ | |||
Align( | |||
alignment: Alignment.centerRight, | |||
child: Padding( | |||
padding: getPadding(right: 1), | |||
child: Text("lbl_powered_by".tr, | |||
overflow: TextOverflow.ellipsis, | |||
textAlign: TextAlign.left, | |||
style: AppStyle.txtRobotoRomanMedium10))), | |||
CustomImageView( | |||
imagePath: ImageConstant.imgImage1, | |||
height: getVerticalSize(21), | |||
width: getHorizontalSize(103), | |||
alignment: Alignment.centerRight), | |||
Padding( | |||
padding: getPadding(left: 32, top: 25, right: 30), | |||
child: Row(children: [ | |||
CustomImageView( | |||
imagePath: ImageConstant.imgRectangle286, | |||
height: getVerticalSize(133), | |||
width: getHorizontalSize(134)), | |||
Padding( | |||
padding: getPadding( | |||
left: 10, top: 32, bottom: 20), | |||
child: Column( | |||
crossAxisAlignment: | |||
CrossAxisAlignment.end, | |||
mainAxisAlignment: | |||
MainAxisAlignment.start, | |||
children: [ | |||
Container( | |||
width: getHorizontalSize(113), | |||
child: Text( | |||
"msg_istituto_comprensivo".tr, | |||
maxLines: null, | |||
textAlign: TextAlign.right, | |||
style: AppStyle | |||
.txtRobotoRomanSemiBold19)), | |||
Padding( | |||
padding: getPadding(top: 6), | |||
child: Text( | |||
"lbl_dante_alighieri".tr, | |||
overflow: | |||
TextOverflow.ellipsis, | |||
textAlign: TextAlign.left, | |||
style: AppStyle | |||
.txtRobotoRomanSemiBold19Lime600)) | |||
])) | |||
])), | |||
Padding( | |||
padding: getPadding(top: 17), | |||
child: Divider(color: ColorConstant.whiteA700)), | |||
Spacer(), | |||
Padding( | |||
padding: getPadding(left: 5), | |||
child: Text("lbl_login".tr, | |||
overflow: TextOverflow.ellipsis, | |||
textAlign: TextAlign.left, | |||
style: AppStyle | |||
.txtRobotoRomanSemiBold19Black900)), | |||
Padding( | |||
padding: getPadding(left: 6, top: 43), | |||
child: Text("lbl_username".tr, | |||
overflow: TextOverflow.ellipsis, | |||
textAlign: TextAlign.left, | |||
style: AppStyle.txtRobotoRomanMedium1324)), | |||
CustomTextFormField( | |||
focusNode: FocusNode(), | |||
controller: controller.masterfieldController, | |||
hintText: "msg_inserisci_il_tuo".tr, | |||
margin: getMargin(left: 5, top: 12, right: 10), | |||
child: Scaffold( | |||
resizeToAvoidBottomInset: false, | |||
body: Container( | |||
decoration: BoxDecoration( | |||
gradient: LinearGradient( | |||
begin: Alignment.topLeft, | |||
end: Alignment.bottomRight, | |||
colors: [Colors.white, Colors.purple], | |||
), | |||
), | |||
child: Stack( | |||
children: [ | |||
Center( // Use Center to vertically and horizontally center the form | |||
child: Column( | |||
mainAxisSize: MainAxisSize.min, // Minimize the column size to its content | |||
children: [ | |||
if (!isRecording || showStartRecordingButton) | |||
Text( | |||
'CookingLab', | |||
style: TextStyle(fontSize: 32, fontWeight: FontWeight.bold), | |||
), | |||
if (!isRecording || showStartRecordingButton) | |||
Form( | |||
key: _formKey, | |||
child: Container( | |||
width: double.maxFinite, | |||
padding: EdgeInsets.symmetric(horizontal: 23), | |||
child: Column( | |||
crossAxisAlignment: CrossAxisAlignment.start, | |||
children: [ | |||
GestureDetector( | |||
onTap: () async { | |||
await showDialog( | |||
context: context, | |||
builder: (BuildContext context) { | |||
return Dialog( | |||
child: Container( | |||
height: MediaQuery.of(context).copyWith().size.height / 3, | |||
child: CupertinoTimerPicker( | |||
mode: CupertinoTimerPickerMode.hms, | |||
onTimerDurationChanged: (Duration duration) { | |||
_timeController1.text = "${duration.inHours.toString().padLeft(2, '0')}:${duration.inMinutes.remainder(60).toString().padLeft(2, '0')}:${duration.inSeconds.remainder(60).toString().padLeft(2, '0')}"; | |||
}, | |||
initialTimerDuration: Duration(hours: DateTime.now().hour, minutes: DateTime.now().minute, seconds: DateTime.now().second), | |||
), | |||
), | |||
); | |||
}, | |||
); | |||
}, | |||
child: AbsorbPointer( | |||
child: CustomTextFormField( | |||
controller: _timeController1, | |||
prefixIcon: Icon(Icons.timer), | |||
hintText: "Inserisci la durata", | |||
decoration: InputDecoration( | |||
border: OutlineInputBorder(), | |||
), | |||
margin: EdgeInsets.fromLTRB(5, 12, 10, 0), | |||
validator: (value) { | |||
if (value != null && !isTime(value)) { | |||
return "Inserisci un'ora valida (HH:MM:SS)"; | |||
} | |||
return null; | |||
}, | |||
), | |||
), | |||
), | |||
CustomTextFormField( | |||
controller: _titleController, | |||
prefixIcon: Icon(Icons.title), | |||
hintText: "Inserisci il titolo", | |||
margin: EdgeInsets.fromLTRB(5, 12, 10, 0), | |||
validator: (value) { | |||
if (!isText(value)) { | |||
return "Please enter valid text"; | |||
if (value != null && !isText(value)) { | |||
return "Inserisci un testo valido"''; | |||
} | |||
return null; | |||
}), | |||
Padding( | |||
padding: getPadding(left: 6, top: 10), | |||
child: Text("lbl_password".tr, | |||
overflow: TextOverflow.ellipsis, | |||
textAlign: TextAlign.left, | |||
style: AppStyle.txtRobotoRomanMedium1324)), | |||
Obx(() => CustomTextFormField( | |||
focusNode: FocusNode(), | |||
controller: controller.masterfieldOneController, | |||
hintText: "msg_inserisci_la_password".tr, | |||
margin: getMargin(left: 7, top: 12, right: 8), | |||
padding: TextFormFieldPadding.PaddingT13, | |||
textInputAction: TextInputAction.done, | |||
textInputType: TextInputType.visiblePassword, | |||
suffix: InkWell( | |||
onTap: () { | |||
controller.isShowPassword.value = | |||
!controller.isShowPassword.value; | |||
}, | |||
child: Container( | |||
margin: getMargin( | |||
left: 30, | |||
top: 14, | |||
right: 12, | |||
bottom: 18), | |||
child: CustomImageView( | |||
svgPath: | |||
controller.isShowPassword.value | |||
? ImageConstant.imgEye | |||
: ImageConstant.imgEye))), | |||
suffixConstraints: BoxConstraints( | |||
maxHeight: getVerticalSize(46)), | |||
}, | |||
), | |||
CustomTextFormField( | |||
controller: _presenterNameController, | |||
prefixIcon: Icon(Icons.person), | |||
hintText: "Inserisci il nome del relatore", | |||
margin: EdgeInsets.fromLTRB(5, 12, 10, 0), | |||
validator: (value) { | |||
if (value == null || | |||
(!isValidPassword(value, | |||
isRequired: true))) { | |||
return "Please enter valid password"; | |||
if (value != null && !isText(value)) { | |||
return "Inserisci un testo valido"; | |||
} | |||
return null; | |||
}, | |||
isObscureText: !controller.isShowPassword.value)), | |||
Align( | |||
alignment: Alignment.centerRight, | |||
child: Padding( | |||
padding: getPadding(top: 10, right: 10), | |||
child: Text("msg_password_dimenticata".tr, | |||
overflow: TextOverflow.ellipsis, | |||
textAlign: TextAlign.left, | |||
style: AppStyle.txtRobotoRomanLight984))), | |||
CustomButton( | |||
text: "lbl_login".tr, | |||
margin: getMargin( | |||
left: 6, top: 26, right: 7, bottom: 175), | |||
), | |||
], | |||
), | |||
), | |||
), | |||
if (!isRecording || showStartRecordingButton) | |||
CustomButton( | |||
text: "inizia a registrare", | |||
margin: EdgeInsets.fromLTRB(50, 30, 50, 10), | |||
variant: ButtonVariant.OutlineBlack9003f, | |||
padding: ButtonPadding.PaddingAll9, | |||
onTap: () async { | |||
if (_formKey.currentState!.validate()) { | |||
setState(() { | |||
isLoading = true; | |||
}); | |||
// Remove focus from any focused text field | |||
FocusScope.of(context).unfocus(); | |||
String token = await loginAndGetToken(); | |||
String time = _timeController1.text; | |||
String camNumber = _camNumberController.text; | |||
Map<String, dynamic> data = { | |||
"title": _titleController.text, | |||
"presenter_name": _presenterNameController.text, | |||
"language": _languageController.text, | |||
}; | |||
try { | |||
await sendPostRequestStart(token, data, time, camNumber); | |||
setState(() { | |||
isRecording = true; | |||
showStartRecordingButton = false; | |||
}); | |||
// Start the timer to update the UI after the duration ends | |||
List<String> timeParts = time.split(':'); | |||
int durationInSeconds = int.parse(timeParts[0]) * 3600 + int.parse(timeParts[1]) * 60 + int.parse(timeParts[2]); | |||
_recordingTimer = Timer(Duration(seconds: durationInSeconds), () { | |||
setState(() { | |||
showStartRecordingButton = true; | |||
_resetFormFields(); | |||
}); | |||
}); | |||
} catch (error) { | |||
setState(() { | |||
isError = true; | |||
}); | |||
} finally { | |||
setState(() { | |||
isLoading = false; | |||
}); | |||
} | |||
} else { | |||
Get.snackbar( | |||
"Errore", | |||
"Si prega di compilare tutti i campi richiesti", | |||
backgroundColor: Colors.red, | |||
colorText: Colors.white, | |||
); | |||
} | |||
}, | |||
), | |||
if (isRecording && !showStartRecordingButton && !isError) | |||
Expanded( | |||
child: Center( | |||
child: Column( | |||
mainAxisSize: MainAxisSize.min, // Minimize the column size to its content | |||
children: [ | |||
Container( | |||
padding: EdgeInsets.all(40), // Increase the padding to increase the size of the Container | |||
decoration: BoxDecoration( | |||
color: Colors.white, // Change this to your preferred color | |||
borderRadius: BorderRadius.circular(15), | |||
boxShadow: [ | |||
BoxShadow( | |||
color: Colors.grey.withOpacity(0.5), | |||
spreadRadius: 5, | |||
blurRadius: 7, | |||
offset: Offset(0, 3), // changes position of shadow | |||
), | |||
], | |||
), | |||
child: Column( | |||
children: [ | |||
Text( | |||
'Dettagli di registrazione', | |||
style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold, color: Colors.black), | |||
), | |||
SizedBox(height: 10), | |||
Text( | |||
'Durata: ${_timeController1.text}', | |||
style: TextStyle(fontSize: 20, color: Colors.black), | |||
), | |||
SizedBox(height: 10), | |||
Text( | |||
'Titolo: ${_titleController.text}', | |||
style: TextStyle(fontSize: 20, color: Colors.black), | |||
), | |||
SizedBox(height: 10), | |||
Text( | |||
'Nome del relatore: ${_presenterNameController.text}', | |||
style: TextStyle(fontSize: 20, color: Colors.black), | |||
), | |||
], | |||
), | |||
), | |||
CustomButton( | |||
text: "Interrompi la registrazione", | |||
margin: EdgeInsets.fromLTRB(80, 10, 80, 10), | |||
variant: ButtonVariant.OutlineBlack9003f, | |||
padding: ButtonPadding.PaddingAll9, | |||
onTap: navigateToHome) | |||
]))))); | |||
padding: ButtonPadding.PaddingAll15, | |||
onTap: () async { | |||
String token = await loginAndGetToken(); | |||
String camNumber = _camNumberController.text; | |||
await sendPostRequestStop(token, camNumber); | |||
setState(() { | |||
isRecording = false; | |||
showStartRecordingButton = true; | |||
_resetFormFields(); | |||
}); | |||
}, | |||
), | |||
], | |||
), | |||
), | |||
), | |||
], | |||
), | |||
), | |||
if (isLoading) | |||
Positioned.fill( | |||
child: Container( | |||
color: Colors.black54, | |||
child: Center( | |||
child: CircularProgressIndicator(), | |||
), | |||
), | |||
), | |||
Positioned( | |||
bottom: 20, | |||
left: 0, | |||
right: 0, | |||
child: isLoading | |||
? SizedBox() // Hide the button when isLoading is true | |||
: CustomButton( | |||
text: "Vai a Fotocamera", | |||
// prefixIcon: Icon(Icons.camera_alt), | |||
margin: EdgeInsets.symmetric(horizontal: 50, vertical: 30), | |||
variant: ButtonVariant.OutlineBlack9003f, | |||
padding: ButtonPadding.PaddingAll9, | |||
onTap: () { | |||
Navigator.push( | |||
context, | |||
MaterialPageRoute(builder: (context) => CameraPage()), | |||
); | |||
}, | |||
), | |||
), | |||
], | |||
), | |||
), | |||
)); | |||
} | |||
void _resetFormFields() { | |||
_timeController1.clear(); | |||
_titleController.clear(); | |||
_presenterNameController.clear(); | |||
} | |||
Future<String> loginAndGetToken() async { | |||
var url = Uri.parse('https://192.168.60.230:5050/auth/login'); | |||
var data = { | |||
'username': dotenv.env['USERNAME'], | |||
'password': dotenv.env['PASSWORD'], | |||
}; | |||
var body = data.keys.map((key) => "${Uri.encodeComponent(key)}=${Uri.encodeComponent(data[key] ?? '')}").join("&"); | |||
HttpClient httpClient = new HttpClient() | |||
..badCertificateCallback = | |||
((X509Certificate cert, String host, int port) => true); | |||
var request = await httpClient.postUrl(url) | |||
..headers.contentType = ContentType("application", "x-www-form-urlencoded") | |||
..write(body); | |||
var response = await request.close(); | |||
var responseBody = await utf8.decodeStream(response); | |||
var parsedJson = jsonDecode(responseBody); | |||
if (parsedJson['access_token'] != null) { | |||
return parsedJson['access_token']; | |||
} else { | |||
throw Exception('Token not found in response'); | |||
} | |||
} | |||
Future<void> sendPostRequestStart(String token, Map<String, dynamic> data, String time, String camNumber) async { | |||
var url = Uri.parse('https://192.168.60.230:5050/start-recording'); | |||
List<String> timeParts = time.split(':'); | |||
int durationInSeconds = int.parse(timeParts[0]) * 3600 + int.parse(timeParts[1]) * 60 + int.parse(timeParts[2]); | |||
durationInSeconds += 10; | |||
var requestData = { | |||
"camera_name": int.parse(camNumber), | |||
"duration": durationInSeconds, | |||
"title": data['title'], | |||
"presenter_name": data['presenter_name'], | |||
"language": data['language'] | |||
}; | |||
var jsonData = jsonEncode(requestData); | |||
HttpClient httpClient = new HttpClient() | |||
..badCertificateCallback = | |||
((X509Certificate cert, String host, int port) => true); | |||
var request = await httpClient.postUrl(url) | |||
..headers.contentType = ContentType.json | |||
..headers.add('Authorization', 'Bearer $token') | |||
..write(jsonData); | |||
var response = await request.close(); | |||
var responseBody = await utf8.decodeStream(response); | |||
var responseJson = jsonDecode(responseBody); | |||
var message = responseJson['message']; | |||
bool isError = message.startsWith('Error:') || message.startsWith('Errore:'); | |||
Get.snackbar( | |||
isError ? "Error" : "Message", | |||
message, | |||
backgroundColor: isError ? Colors.red : Colors.green, | |||
colorText: Colors.white, | |||
); | |||
setState(() { | |||
this.isError = isError; | |||
if (isError) { | |||
isRecording = false; | |||
throw Exception('Failed to start recording'); | |||
} | |||
}); | |||
} | |||
Future<void> sendPostRequestStop(String token, String camNumber) async { | |||
var url = Uri.parse('https://192.168.60.230:5050/stop-recording'); | |||
var requestData = { | |||
"camera_name": int.parse(camNumber), | |||
}; | |||
var jsonData = jsonEncode(requestData); | |||
HttpClient httpClient = new HttpClient() | |||
..badCertificateCallback = | |||
((X509Certificate cert, String host, int port) => true); | |||
var request = await httpClient.postUrl(url) | |||
..headers.contentType = ContentType.json | |||
..headers.add('Authorization', 'Bearer $token') | |||
..write(jsonData); | |||
var response = await request.close(); | |||
var responseBody = await utf8.decodeStream(response); | |||
var responseJson = jsonDecode(responseBody); | |||
var message = responseJson['message']; | |||
bool isError = message.startsWith('Error:') || message.startsWith('Errore:'); | |||
Get.snackbar( | |||
isError ? "Error" : "Message", | |||
message, | |||
backgroundColor: isError ? Colors.red : Colors.green, | |||
colorText: Colors.white, | |||
); | |||
setState(() { | |||
this.isError = isError; | |||
if (!isError) { | |||
isRecording = false; | |||
_timeController1.clear(); | |||
_titleController.clear(); | |||
_presenterNameController.clear(); | |||
} | |||
}); | |||
} | |||
bool isTime(String time) { | |||
var timeParts = time.split(':'); | |||
if (timeParts.length != 3) { | |||
return false; | |||
} | |||
var hours = int.tryParse(timeParts[0]); | |||
var minutes = int.tryParse(timeParts[1]); | |||
var seconds = int.tryParse(timeParts[2]); | |||
return hours != null && hours >= 0 && hours < 24 && | |||
minutes != null && minutes >= 0 && minutes < 60 && | |||
seconds != null && seconds >= 0 && seconds < 60; | |||
} | |||
navigateToHome() { | |||
Get.toNamed(AppRoutes.abilitaDisabilitaClasseTwoScreen); | |||
bool isText(String? value) { | |||
return value != null && value.isNotEmpty; | |||
} | |||
} |
@@ -1,90 +1,314 @@ | |||
import 'controller/splash_screen_one_controller.dart'; | |||
import 'package:flutter/material.dart'; | |||
import 'package:michele_s_application8/core/app_export.dart'; | |||
import 'dart:async'; | |||
import 'package:dots_indicator/dots_indicator.dart'; | |||
// | |||
// class SplashScreenOneScreen extends GetWidget<SplashScreenOneController> { | |||
// @override | |||
// // Widget build(BuildContext context) { | |||
// // return SafeArea( | |||
// // child: Scaffold( | |||
// // backgroundColor: ColorConstant.whiteA700, | |||
// // body: Container( | |||
// // width: double.maxFinite, | |||
// // padding: getPadding(all: 14), | |||
// // child: Column( | |||
// // crossAxisAlignment: CrossAxisAlignment.end, | |||
// // mainAxisAlignment: MainAxisAlignment.start, | |||
// // children: [ | |||
// // Padding( | |||
// // padding: getPadding(right: 6), | |||
// // child: Text("lbl_powered_by".tr, | |||
// // overflow: TextOverflow.ellipsis, | |||
// // textAlign: TextAlign.left, | |||
// // style: AppStyle.txtRobotoRomanMedium10)), | |||
// // CustomImageView( | |||
// // imagePath: ImageConstant.imgImage1, | |||
// // height: getVerticalSize(21), | |||
// // width: getHorizontalSize(103), | |||
// // margin: getMargin(right: 6)), | |||
// // Spacer(), | |||
// // Container( | |||
// // height: getVerticalSize(352), | |||
// // width: getHorizontalSize(345), | |||
// // margin: getMargin(right: 1, bottom: 215), | |||
// // child: Stack(alignment: Alignment.center, children: [ | |||
// // Align( | |||
// // alignment: Alignment.center, | |||
// // child: Container( | |||
// // height: getVerticalSize(352), | |||
// // width: getHorizontalSize(345), | |||
// // decoration: BoxDecoration( | |||
// // color: ColorConstant.whiteA7009e, | |||
// // borderRadius: BorderRadius.circular( | |||
// // getHorizontalSize(176))))), | |||
// // Align( | |||
// // alignment: Alignment.center, | |||
// // child: Row( | |||
// // mainAxisAlignment: MainAxisAlignment.center, | |||
// // children: [ | |||
// // CustomImageView( | |||
// // imagePath: | |||
// // ImageConstant.imgRectangle286, | |||
// // height: getVerticalSize(133), | |||
// // width: getHorizontalSize(134)), | |||
// // Padding( | |||
// // padding: getPadding( | |||
// // left: 6, top: 148, bottom: 20), | |||
// // child: Column( | |||
// // crossAxisAlignment: | |||
// // CrossAxisAlignment.end, | |||
// // mainAxisAlignment: | |||
// // MainAxisAlignment.start, | |||
// // children: [ | |||
// // Container( | |||
// // width: | |||
// // getHorizontalSize(113), | |||
// // child: Text( | |||
// // "msg_istituto_comprensivo" | |||
// // .tr, | |||
// // maxLines: null, | |||
// // textAlign: | |||
// // TextAlign.right, | |||
// // style: AppStyle | |||
// // .txtRobotoRomanSemiBold19)), | |||
// // Padding( | |||
// // padding: getPadding(top: 6), | |||
// // child: Text( | |||
// // "lbl_dante_alighieri" | |||
// // .tr, | |||
// // overflow: TextOverflow | |||
// // .ellipsis, | |||
// // textAlign: | |||
// // TextAlign.left, | |||
// // style: AppStyle | |||
// // .txtRobotoRomanSemiBold19Lime600)) | |||
// // ])) | |||
// // ])) | |||
// // ])) | |||
// // ])))); | |||
// // } | |||
// } | |||
class SplashScreenOneScreen extends StatefulWidget { | |||
@override | |||
_SplashScreenOneScreenState createState() => _SplashScreenOneScreenState(); | |||
} | |||
// class _SplashScreenOneScreenState extends State<SplashScreenOneScreen> with AutomaticKeepAliveClientMixin { | |||
// final controller = PageController(); | |||
// Timer? _timer; | |||
// double currentPage = 0; | |||
// | |||
// @override | |||
// void initState() { | |||
// super.initState(); | |||
// _timer = Timer.periodic(Duration(seconds: 5), (Timer timer) { | |||
// if (controller.page?.round() == controller.page) { | |||
// if (controller.page == 2) { | |||
// controller.jumpToPage(0); | |||
// } else { | |||
// controller.nextPage( | |||
// duration: Duration(milliseconds: 2000), | |||
// curve: Curves.ease, | |||
// ); | |||
// } | |||
// } | |||
// }); | |||
// controller.addListener(() { | |||
// setState(() { | |||
// currentPage = controller.page!; | |||
// }); | |||
// }); | |||
// } | |||
// | |||
// @override | |||
// void dispose() { | |||
// _timer?.cancel(); | |||
// super.dispose(); | |||
// } | |||
// | |||
// @override | |||
// Widget build(BuildContext context) { | |||
// return Scaffold( | |||
// body: Stack( | |||
// children: [ | |||
// PageView.builder( | |||
// controller: controller, | |||
// itemCount: 3, | |||
// itemBuilder: (context, index) { | |||
// return GestureDetector( | |||
// onTap: () { | |||
// Navigator.pushNamed(context, '/login_screen'); | |||
// }, | |||
// child: Stack( | |||
// fit: StackFit.expand, | |||
// children: [ | |||
// Image.asset( | |||
// 'assets/images/img${index + 1}.png', | |||
// fit: BoxFit.cover, | |||
// ), | |||
// Positioned( | |||
// bottom: 300, | |||
// left: 20, | |||
// child: Text( | |||
// 'CookingLab', | |||
// style: TextStyle( | |||
// color: Colors.white, | |||
// fontSize: 24, | |||
// fontWeight: FontWeight.bold, | |||
// shadows: <Shadow>[ | |||
// Shadow( | |||
// offset: Offset(2.0, 2.0), | |||
// blurRadius: 3.0, | |||
// color: Color.fromARGB(255, 0, 0, 0), | |||
// ), | |||
// ], | |||
// ), | |||
// ), | |||
// ), | |||
// ], | |||
// ), | |||
// ); | |||
// }, | |||
// ), | |||
// Positioned( | |||
// bottom: 20, | |||
// left: 0, | |||
// right: 0, | |||
// child: Center( | |||
// child: DotsIndicator( | |||
// dotsCount: 3, | |||
// position: currentPage, | |||
// decorator: DotsDecorator( | |||
// activeColor: Colors.white, | |||
// ), | |||
// ), | |||
// ), | |||
// ), | |||
// ], | |||
// ), | |||
// ); | |||
// } | |||
// | |||
// @override | |||
// bool get wantKeepAlive => true; | |||
// } | |||
class _SplashScreenOneScreenState extends State<SplashScreenOneScreen> with AutomaticKeepAliveClientMixin { | |||
final controller = PageController(); | |||
Timer? _timer; | |||
double currentPage = 0; | |||
// Add your image paths here | |||
final List<String> imagePaths = [ | |||
'assets/images/foto-CookingLab.jpeg', | |||
'assets/images/img2.png', | |||
'assets/images/img3.png', | |||
]; | |||
// Add your text here | |||
final List<String> imageTexts = [ | |||
'HELLO', | |||
'CookingLab', | |||
'Text 3', | |||
]; | |||
@override | |||
void initState() { | |||
super.initState(); | |||
_timer = Timer.periodic(Duration(seconds: 5), (Timer timer) { | |||
if (controller.page?.round() == controller.page) { | |||
if (controller.page == 2) { | |||
controller.jumpToPage(0); | |||
} else { | |||
controller.nextPage( | |||
duration: Duration(milliseconds: 2000), | |||
curve: Curves.ease, | |||
); | |||
} | |||
} | |||
}); | |||
controller.addListener(() { | |||
setState(() { | |||
currentPage = controller.page!; | |||
}); | |||
}); | |||
} | |||
@override | |||
void dispose() { | |||
_timer?.cancel(); | |||
super.dispose(); | |||
} | |||
class SplashScreenOneScreen extends GetWidget<SplashScreenOneController> { | |||
@override | |||
Widget build(BuildContext context) { | |||
return SafeArea( | |||
child: Scaffold( | |||
backgroundColor: ColorConstant.whiteA700, | |||
body: Container( | |||
width: double.maxFinite, | |||
padding: getPadding(all: 14), | |||
child: Column( | |||
crossAxisAlignment: CrossAxisAlignment.end, | |||
mainAxisAlignment: MainAxisAlignment.start, | |||
children: [ | |||
Padding( | |||
padding: getPadding(right: 6), | |||
child: Text("lbl_powered_by".tr, | |||
overflow: TextOverflow.ellipsis, | |||
textAlign: TextAlign.left, | |||
style: AppStyle.txtRobotoRomanMedium10)), | |||
CustomImageView( | |||
imagePath: ImageConstant.imgImage1, | |||
height: getVerticalSize(21), | |||
width: getHorizontalSize(103), | |||
margin: getMargin(right: 6)), | |||
Spacer(), | |||
Container( | |||
height: getVerticalSize(352), | |||
width: getHorizontalSize(345), | |||
margin: getMargin(right: 1, bottom: 215), | |||
child: Stack(alignment: Alignment.center, children: [ | |||
Align( | |||
alignment: Alignment.center, | |||
child: Container( | |||
height: getVerticalSize(352), | |||
width: getHorizontalSize(345), | |||
decoration: BoxDecoration( | |||
color: ColorConstant.whiteA7009e, | |||
borderRadius: BorderRadius.circular( | |||
getHorizontalSize(176))))), | |||
Align( | |||
alignment: Alignment.center, | |||
child: Row( | |||
mainAxisAlignment: MainAxisAlignment.center, | |||
children: [ | |||
CustomImageView( | |||
imagePath: | |||
ImageConstant.imgRectangle286, | |||
height: getVerticalSize(133), | |||
width: getHorizontalSize(134)), | |||
Padding( | |||
padding: getPadding( | |||
left: 6, top: 148, bottom: 20), | |||
child: Column( | |||
crossAxisAlignment: | |||
CrossAxisAlignment.end, | |||
mainAxisAlignment: | |||
MainAxisAlignment.start, | |||
children: [ | |||
Container( | |||
width: | |||
getHorizontalSize(113), | |||
child: Text( | |||
"msg_istituto_comprensivo" | |||
.tr, | |||
maxLines: null, | |||
textAlign: | |||
TextAlign.right, | |||
style: AppStyle | |||
.txtRobotoRomanSemiBold19)), | |||
Padding( | |||
padding: getPadding(top: 6), | |||
child: Text( | |||
"lbl_dante_alighieri" | |||
.tr, | |||
overflow: TextOverflow | |||
.ellipsis, | |||
textAlign: | |||
TextAlign.left, | |||
style: AppStyle | |||
.txtRobotoRomanSemiBold19Lime600)) | |||
])) | |||
])) | |||
])) | |||
])))); | |||
return Scaffold( | |||
body: Stack( | |||
children: [ | |||
PageView.builder( | |||
controller: controller, | |||
itemCount: 3, | |||
itemBuilder: (context, index) { | |||
return GestureDetector( | |||
onTap: () { | |||
Navigator.pushNamed(context, '/login_screen'); | |||
}, | |||
child: Stack( | |||
fit: StackFit.expand, | |||
children: [ | |||
Image.asset( | |||
imagePaths[index], // Use the index to display the corresponding image | |||
fit: BoxFit.cover, | |||
), | |||
Positioned( | |||
bottom: 300, | |||
left: 20, | |||
child: Text( | |||
imageTexts[index], // Use the index to display the corresponding text | |||
style: TextStyle( | |||
color: Colors.white, | |||
fontSize: 24, | |||
fontWeight: FontWeight.bold, | |||
shadows: <Shadow>[ | |||
Shadow( | |||
offset: Offset(2.0, 2.0), | |||
blurRadius: 3.0, | |||
color: Color.fromARGB(255, 0, 0, 0), | |||
), | |||
], | |||
), | |||
), | |||
), | |||
], | |||
), | |||
); | |||
}, | |||
), | |||
Positioned( | |||
bottom: 20, | |||
left: 0, | |||
right: 0, | |||
child: Center( | |||
child: DotsIndicator( | |||
dotsCount: 3, | |||
position: currentPage, | |||
decorator: DotsDecorator( | |||
activeColor: Colors.white, | |||
), | |||
), | |||
), | |||
), | |||
], | |||
), | |||
); | |||
} | |||
} | |||
@override | |||
bool get wantKeepAlive => true; | |||
} |
@@ -73,7 +73,8 @@ class CustomImageView extends StatelessWidget { | |||
_buildCircleImage() { | |||
if (radius != null) { | |||
return ClipRRect( | |||
borderRadius: radius, | |||
// borderRadius: radius, | |||
borderRadius: radius ?? BorderRadius.zero, | |||
child: _buildImageWithBorder(), | |||
); | |||
} else { | |||
@@ -1,87 +1,71 @@ | |||
import 'package:flutter/material.dart'; | |||
import 'package:michele_s_application8/core/app_export.dart'; | |||
class CustomTextFormField extends StatelessWidget { | |||
CustomTextFormField( | |||
{this.shape, | |||
this.padding, | |||
this.variant, | |||
this.fontStyle, | |||
this.alignment, | |||
this.width, | |||
this.margin, | |||
this.controller, | |||
this.focusNode, | |||
this.isObscureText = false, | |||
this.textInputAction = TextInputAction.next, | |||
this.textInputType = TextInputType.text, | |||
this.maxLines, | |||
this.hintText, | |||
this.prefix, | |||
this.prefixConstraints, | |||
this.suffix, | |||
this.suffixConstraints, | |||
this.validator}); | |||
TextFormFieldShape? shape; | |||
TextFormFieldPadding? padding; | |||
TextFormFieldVariant? variant; | |||
TextFormFieldFontStyle? fontStyle; | |||
Alignment? alignment; | |||
double? width; | |||
EdgeInsetsGeometry? margin; | |||
TextEditingController? controller; | |||
FocusNode? focusNode; | |||
bool? isObscureText; | |||
TextInputAction? textInputAction; | |||
TextInputType? textInputType; | |||
int? maxLines; | |||
String? hintText; | |||
Widget? prefix; | |||
BoxConstraints? prefixConstraints; | |||
Widget? suffix; | |||
BoxConstraints? suffixConstraints; | |||
FormFieldValidator<String>? validator; | |||
final OutlineInputBorder? shape; | |||
final EdgeInsetsGeometry? padding; | |||
final String? variant; | |||
final TextStyle? fontStyle; | |||
final Alignment? alignment; | |||
final double? width; | |||
final EdgeInsetsGeometry? margin; | |||
final TextEditingController? controller; | |||
final FocusNode? focusNode; | |||
final bool? isObscureText; | |||
final TextInputAction? textInputAction; | |||
final TextInputType? textInputType; | |||
final int? maxLines; | |||
final String? hintText; | |||
final Widget? prefixIcon; | |||
final Widget? suffixIcon; | |||
final BoxConstraints? prefixIconConstraints; | |||
final BoxConstraints? suffixIconConstraints; | |||
final FormFieldValidator<String>? validator; | |||
final InputDecoration decoration; | |||
CustomTextFormField({ | |||
this.shape, | |||
this.padding, | |||
this.variant, | |||
this.fontStyle, | |||
this.alignment, | |||
this.width, | |||
this.margin, | |||
this.controller, | |||
this.focusNode, | |||
this.isObscureText = false, | |||
this.textInputAction = TextInputAction.next, | |||
this.textInputType = TextInputType.text, | |||
this.maxLines, | |||
this.hintText, | |||
this.prefixIcon, | |||
this.prefixIconConstraints, | |||
this.suffixIcon, | |||
this.suffixIconConstraints, | |||
this.validator, | |||
this.decoration = const InputDecoration(), | |||
}); | |||
@override | |||
Widget build(BuildContext context) { | |||
return alignment != null | |||
? Align( | |||
alignment: alignment ?? Alignment.center, | |||
child: _buildTextFormFieldWidget(), | |||
) | |||
alignment: alignment!, | |||
child: _buildTextFormFieldWidget(), | |||
) | |||
: _buildTextFormFieldWidget(); | |||
} | |||
_buildTextFormFieldWidget() { | |||
Widget _buildTextFormFieldWidget() { | |||
return Container( | |||
width: width ?? double.maxFinite, | |||
margin: margin, | |||
child: TextFormField( | |||
controller: controller, | |||
focusNode: focusNode, | |||
style: _setFontStyle(), | |||
style: fontStyle, | |||
obscureText: isObscureText!, | |||
textInputAction: textInputAction, | |||
keyboardType: textInputType, | |||
textInputAction: textInputAction!, | |||
keyboardType: textInputType!, | |||
maxLines: maxLines ?? 1, | |||
decoration: _buildDecoration(), | |||
validator: validator, | |||
@@ -89,117 +73,19 @@ class CustomTextFormField extends StatelessWidget { | |||
); | |||
} | |||
_buildDecoration() { | |||
InputDecoration _buildDecoration() { | |||
return InputDecoration( | |||
hintText: hintText ?? "", | |||
hintStyle: _setFontStyle(), | |||
border: _setBorderStyle(), | |||
enabledBorder: _setBorderStyle(), | |||
focusedBorder: _setBorderStyle(), | |||
disabledBorder: _setBorderStyle(), | |||
prefixIcon: prefix, | |||
prefixIconConstraints: prefixConstraints, | |||
suffixIcon: suffix, | |||
suffixIconConstraints: suffixConstraints, | |||
fillColor: _setFillColor(), | |||
filled: _setFilled(), | |||
isDense: true, | |||
contentPadding: _setPadding(), | |||
hintText: hintText, | |||
hintStyle: fontStyle, | |||
border: shape ?? OutlineInputBorder( | |||
borderRadius: BorderRadius.circular(10), | |||
borderSide: BorderSide(width: 2), | |||
), | |||
contentPadding: padding, | |||
prefixIcon: prefixIcon, | |||
prefixIconConstraints: prefixIconConstraints, | |||
suffixIcon: suffixIcon, | |||
suffixIconConstraints: suffixIconConstraints, | |||
); | |||
} | |||
_setFontStyle() { | |||
switch (fontStyle) { | |||
default: | |||
return TextStyle( | |||
color: ColorConstant.gray500, | |||
fontSize: getFontSize( | |||
13.24, | |||
), | |||
fontFamily: 'Roboto', | |||
fontWeight: FontWeight.w400, | |||
height: getVerticalSize( | |||
1.21, | |||
), | |||
); | |||
} | |||
} | |||
_setOutlineBorderRadius() { | |||
switch (shape) { | |||
default: | |||
return BorderRadius.circular( | |||
getHorizontalSize( | |||
20.00, | |||
), | |||
); | |||
} | |||
} | |||
_setBorderStyle() { | |||
switch (variant) { | |||
case TextFormFieldVariant.None: | |||
return InputBorder.none; | |||
default: | |||
return OutlineInputBorder( | |||
borderRadius: _setOutlineBorderRadius(), | |||
borderSide: BorderSide( | |||
color: ColorConstant.gray300, | |||
width: 1, | |||
), | |||
); | |||
} | |||
} | |||
_setFillColor() { | |||
switch (variant) { | |||
default: | |||
return ColorConstant.whiteA700; | |||
} | |||
} | |||
_setFilled() { | |||
switch (variant) { | |||
case TextFormFieldVariant.None: | |||
return false; | |||
default: | |||
return true; | |||
} | |||
} | |||
_setPadding() { | |||
switch (padding) { | |||
case TextFormFieldPadding.PaddingT13: | |||
return getPadding( | |||
left: 13, | |||
top: 13, | |||
bottom: 13, | |||
); | |||
default: | |||
return getPadding( | |||
left: 12, | |||
top: 14, | |||
right: 12, | |||
bottom: 14, | |||
); | |||
} | |||
} | |||
} | |||
enum TextFormFieldShape { | |||
RoundedBorder20, | |||
} | |||
enum TextFormFieldPadding { | |||
PaddingT14, | |||
PaddingT13, | |||
} | |||
enum TextFormFieldVariant { | |||
None, | |||
OutlineGray300, | |||
} | |||
enum TextFormFieldFontStyle { | |||
RobotoRomanRegular1324, | |||
} |
@@ -5,26 +5,26 @@ packages: | |||
dependency: transitive | |||
description: | |||
name: archive | |||
sha256: d6347d54a2d8028e0437e3c099f66fdb8ae02c4720c1e7534c9f24c10351f85d | |||
sha256: cb6a278ef2dbb298455e1a713bda08524a175630ec643a242c399c932a0a1f7d | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "3.3.6" | |||
version: "3.6.1" | |||
args: | |||
dependency: transitive | |||
description: | |||
name: args | |||
sha256: "4cab82a83ffef80b262ddedf47a0a8e56ee6fbf7fe21e6e768b02792034dd440" | |||
sha256: "7cf60b9f0cc88203c5a190b4cd62a99feea42759a7fa695010eb5de1c0b2252a" | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "2.4.0" | |||
version: "2.5.0" | |||
async: | |||
dependency: transitive | |||
description: | |||
name: async | |||
sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0 | |||
sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "2.10.0" | |||
version: "2.11.0" | |||
boolean_selector: | |||
dependency: transitive | |||
description: | |||
@@ -37,42 +37,42 @@ packages: | |||
dependency: "direct main" | |||
description: | |||
name: cached_network_image | |||
sha256: fd3d0dc1d451f9a252b32d95d3f0c3c487bc41a75eba2e6097cb0b9c71491b15 | |||
sha256: "28ea9690a8207179c319965c13cd8df184d5ee721ae2ce60f398ced1219cea1f" | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "3.2.3" | |||
version: "3.3.1" | |||
cached_network_image_platform_interface: | |||
dependency: transitive | |||
description: | |||
name: cached_network_image_platform_interface | |||
sha256: bb2b8403b4ccdc60ef5f25c70dead1f3d32d24b9d6117cfc087f496b178594a7 | |||
sha256: "9e90e78ae72caa874a323d78fa6301b3fb8fa7ea76a8f96dc5b5bf79f283bf2f" | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "2.0.0" | |||
version: "4.0.0" | |||
cached_network_image_web: | |||
dependency: transitive | |||
description: | |||
name: cached_network_image_web | |||
sha256: b8eb814ebfcb4dea049680f8c1ffb2df399e4d03bf7a352c775e26fa06e02fa0 | |||
sha256: "205d6a9f1862de34b93184f22b9d2d94586b2f05c581d546695e3d8f6a805cd7" | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "1.0.2" | |||
version: "1.2.0" | |||
characters: | |||
dependency: transitive | |||
description: | |||
name: characters | |||
sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c | |||
sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "1.2.1" | |||
version: "1.3.0" | |||
checked_yaml: | |||
dependency: transitive | |||
description: | |||
name: checked_yaml | |||
sha256: "3d1505d91afa809d177efd4eed5bb0eb65805097a1463abdd2add076effae311" | |||
sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "2.0.2" | |||
version: "2.0.3" | |||
cli_util: | |||
dependency: transitive | |||
description: | |||
@@ -93,10 +93,10 @@ packages: | |||
dependency: transitive | |||
description: | |||
name: collection | |||
sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0 | |||
sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "1.17.0" | |||
version: "1.18.0" | |||
connectivity_plus: | |||
dependency: "direct main" | |||
description: | |||
@@ -145,30 +145,30 @@ packages: | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "1.2.2" | |||
convert: | |||
dependency: transitive | |||
description: | |||
name: convert | |||
sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "3.1.1" | |||
crypto: | |||
dependency: transitive | |||
description: | |||
name: crypto | |||
sha256: aa274aa7774f8964e4f4f38cc994db7b6158dd36e9187aaceaddc994b35c6c67 | |||
sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "3.0.2" | |||
version: "3.0.3" | |||
dbus: | |||
dependency: transitive | |||
description: | |||
name: dbus | |||
sha256: "6f07cba3f7b3448d42d015bfd3d53fe12e5b36da2423f23838efc1d5fb31a263" | |||
sha256: "365c771ac3b0e58845f39ec6deebc76e3276aa9922b0cc60840712094d9047ac" | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "0.7.8" | |||
version: "0.7.10" | |||
dots_indicator: | |||
dependency: "direct main" | |||
description: | |||
name: dots_indicator | |||
sha256: f1599baa429936ba87f06ae5f2adc920a367b16d08f74db58c3d0f6e93bcdb5c | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "2.1.2" | |||
fake_async: | |||
dependency: transitive | |||
description: | |||
@@ -181,10 +181,10 @@ packages: | |||
dependency: transitive | |||
description: | |||
name: ffi | |||
sha256: a38574032c5f1dd06c4aee541789906c12ccaab8ba01446e800d9c5b79c4a978 | |||
sha256: "493f37e7df1804778ff3a53bd691d8692ddf69702cf4c1c1096a2e41b4779e21" | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "2.0.1" | |||
version: "2.1.2" | |||
file: | |||
dependency: "direct main" | |||
description: | |||
@@ -193,27 +193,35 @@ packages: | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "6.1.4" | |||
fixnum: | |||
dependency: transitive | |||
description: | |||
name: fixnum | |||
sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "1.1.0" | |||
flutter: | |||
dependency: "direct main" | |||
description: flutter | |||
source: sdk | |||
version: "0.0.0" | |||
flutter_blurhash: | |||
flutter_cache_manager: | |||
dependency: transitive | |||
description: | |||
name: flutter_blurhash | |||
sha256: "05001537bd3fac7644fa6558b09ec8c0a3f2eba78c0765f88912882b1331a5c6" | |||
name: flutter_cache_manager | |||
sha256: "8207f27539deb83732fdda03e259349046a39a4c767269285f449ade355d54ba" | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "0.7.0" | |||
flutter_cache_manager: | |||
dependency: transitive | |||
version: "3.3.1" | |||
flutter_dotenv: | |||
dependency: "direct main" | |||
description: | |||
name: flutter_cache_manager | |||
sha256: "32cd900555219333326a2d0653aaaf8671264c29befa65bbd9856d204a4c9fb3" | |||
name: flutter_dotenv | |||
sha256: "9357883bdd153ab78cbf9ffa07656e336b8bbb2b5a3ca596b0b27e119f7c7d77" | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "3.3.0" | |||
version: "5.1.0" | |||
flutter_launcher_icons: | |||
dependency: "direct dev" | |||
description: | |||
@@ -252,18 +260,18 @@ packages: | |||
dependency: "direct main" | |||
description: | |||
name: get | |||
sha256: "2ba20a47c8f1f233bed775ba2dd0d3ac97b4cf32fc17731b3dfc672b06b0e92a" | |||
sha256: e4e7335ede17452b391ed3b2ede016545706c01a02292a6c97619705e7d2a85e | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "4.6.5" | |||
version: "4.6.6" | |||
http: | |||
dependency: transitive | |||
description: | |||
name: http | |||
sha256: "6aa2946395183537c8b880962d935877325d6a09a2867c3970c05c0fed6ac482" | |||
sha256: "761a297c042deedc1ffbb156d6e2af13886bb305c2a343a4d972504cd67dd938" | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "0.13.5" | |||
version: "1.2.1" | |||
http_parser: | |||
dependency: transitive | |||
description: | |||
@@ -276,10 +284,10 @@ packages: | |||
dependency: transitive | |||
description: | |||
name: image | |||
sha256: "483a389d6ccb292b570c31b3a193779b1b0178e7eb571986d9a49904b6861227" | |||
sha256: "2237616a36c0d69aef7549ab439b833fb7f9fb9fc861af2cc9ac3eedddd69ca8" | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "4.0.15" | |||
version: "4.2.0" | |||
intl: | |||
dependency: "direct main" | |||
description: | |||
@@ -292,42 +300,66 @@ packages: | |||
dependency: transitive | |||
description: | |||
name: js | |||
sha256: "5528c2f391ededb7775ec1daa69e65a2d61276f7552de2b5f7b8d34ee9fd4ab7" | |||
sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "0.6.5" | |||
version: "0.6.7" | |||
json_annotation: | |||
dependency: transitive | |||
description: | |||
name: json_annotation | |||
sha256: c33da08e136c3df0190bd5bbe51ae1df4a7d96e7954d1d7249fea2968a72d317 | |||
sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "4.8.0" | |||
version: "4.9.0" | |||
leak_tracker: | |||
dependency: transitive | |||
description: | |||
name: leak_tracker | |||
sha256: "78eb209deea09858f5269f5a5b02be4049535f568c07b275096836f01ea323fa" | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "10.0.0" | |||
leak_tracker_flutter_testing: | |||
dependency: transitive | |||
description: | |||
name: leak_tracker_flutter_testing | |||
sha256: b46c5e37c19120a8a01918cfaf293547f47269f7cb4b0058f21531c2465d6ef0 | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "2.0.1" | |||
leak_tracker_testing: | |||
dependency: transitive | |||
description: | |||
name: leak_tracker_testing | |||
sha256: a597f72a664dbd293f3bfc51f9ba69816f84dcd403cdac7066cb3f6003f3ab47 | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "2.0.1" | |||
matcher: | |||
dependency: transitive | |||
description: | |||
name: matcher | |||
sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72" | |||
sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "0.12.13" | |||
version: "0.12.16+1" | |||
material_color_utilities: | |||
dependency: transitive | |||
description: | |||
name: material_color_utilities | |||
sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 | |||
sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "0.2.0" | |||
version: "0.8.0" | |||
meta: | |||
dependency: transitive | |||
description: | |||
name: meta | |||
sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42" | |||
sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04 | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "1.8.0" | |||
version: "1.11.0" | |||
nm: | |||
dependency: transitive | |||
description: | |||
@@ -340,18 +372,18 @@ packages: | |||
dependency: transitive | |||
description: | |||
name: octo_image | |||
sha256: "107f3ed1330006a3bea63615e81cf637433f5135a52466c7caa0e7152bca9143" | |||
sha256: "45b40f99622f11901238e18d48f5f12ea36426d8eced9f4cbf58479c7aa2430d" | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "1.0.2" | |||
version: "2.0.0" | |||
path: | |||
dependency: transitive | |||
description: | |||
name: path | |||
sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b | |||
sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "1.8.2" | |||
version: "1.9.0" | |||
path_drawing: | |||
dependency: transitive | |||
description: | |||
@@ -372,98 +404,74 @@ packages: | |||
dependency: transitive | |||
description: | |||
name: path_provider | |||
sha256: "04890b994ee89bfa80bf3080bfec40d5a92c5c7a785ebb02c13084a099d2b6f9" | |||
sha256: c9e7d3a4cd1410877472158bee69963a4579f78b68c65a2b7d40d1a7a88bb161 | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "2.0.13" | |||
version: "2.1.3" | |||
path_provider_android: | |||
dependency: transitive | |||
description: | |||
name: path_provider_android | |||
sha256: "7623b7d4be0f0f7d9a8b5ee6879fc13e4522d4c875ab86801dee4af32b54b83e" | |||
sha256: a248d8146ee5983446bf03ed5ea8f6533129a12b11f12057ad1b4a67a2b3b41d | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "2.0.23" | |||
version: "2.2.4" | |||
path_provider_foundation: | |||
dependency: transitive | |||
description: | |||
name: path_provider_foundation | |||
sha256: eec003594f19fe2456ea965ae36b3fc967bc5005f508890aafe31fa75e41d972 | |||
sha256: f234384a3fdd67f989b4d54a5d73ca2a6c422fa55ae694381ae0f4375cd1ea16 | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "2.1.2" | |||
version: "2.4.0" | |||
path_provider_linux: | |||
dependency: transitive | |||
description: | |||
name: path_provider_linux | |||
sha256: "525ad5e07622d19447ad740b1ed5070031f7a5437f44355ae915ff56e986429a" | |||
sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "2.1.9" | |||
version: "2.2.1" | |||
path_provider_platform_interface: | |||
dependency: transitive | |||
description: | |||
name: path_provider_platform_interface | |||
sha256: "57585299a729335f1298b43245842678cb9f43a6310351b18fb577d6e33165ec" | |||
sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "2.0.6" | |||
version: "2.1.2" | |||
path_provider_windows: | |||
dependency: transitive | |||
description: | |||
name: path_provider_windows | |||
sha256: "642ddf65fde5404f83267e8459ddb4556316d3ee6d511ed193357e25caa3632d" | |||
sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170" | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "2.1.4" | |||
pedantic: | |||
dependency: transitive | |||
description: | |||
name: pedantic | |||
sha256: "67fc27ed9639506c856c840ccce7594d0bdcd91bc8d53d6e52359449a1d50602" | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "1.11.1" | |||
version: "2.2.1" | |||
petitparser: | |||
dependency: transitive | |||
description: | |||
name: petitparser | |||
sha256: "49392a45ced973e8d94a85fdb21293fbb40ba805fc49f2965101ae748a3683b4" | |||
sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27 | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "5.1.0" | |||
version: "6.0.2" | |||
platform: | |||
dependency: transitive | |||
description: | |||
name: platform | |||
sha256: "4a451831508d7d6ca779f7ac6e212b4023dd5a7d08a27a63da33756410e32b76" | |||
sha256: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65" | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "3.1.0" | |||
version: "3.1.5" | |||
plugin_platform_interface: | |||
dependency: transitive | |||
description: | |||
name: plugin_platform_interface | |||
sha256: "6a2128648c854906c53fa8e33986fc0247a1116122f9534dd20e3ab9e16a32bc" | |||
sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "2.1.4" | |||
pointycastle: | |||
dependency: transitive | |||
description: | |||
name: pointycastle | |||
sha256: db7306cf0249f838d1a24af52b5a5887c5bf7f31d8bb4e827d071dc0939ad346 | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "3.6.2" | |||
process: | |||
dependency: transitive | |||
description: | |||
name: process | |||
sha256: "53fd8db9cec1d37b0574e12f07520d582019cb6c44abf5479a01505099a34a09" | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "4.2.4" | |||
version: "2.1.8" | |||
rxdart: | |||
dependency: transitive | |||
description: | |||
@@ -476,58 +484,58 @@ packages: | |||
dependency: "direct main" | |||
description: | |||
name: shared_preferences | |||
sha256: ee6257848f822b8481691f20c3e6d2bfee2e9eccb2a3d249907fcfb198c55b41 | |||
sha256: d3bbe5553a986e83980916ded2f0b435ef2e1893dfaa29d5a7a790d0eca12180 | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "2.0.18" | |||
version: "2.2.3" | |||
shared_preferences_android: | |||
dependency: transitive | |||
description: | |||
name: shared_preferences_android | |||
sha256: a51a4f9375097f94df1c6e0a49c0374440d31ab026b59d58a7e7660675879db4 | |||
sha256: "1ee8bf911094a1b592de7ab29add6f826a7331fb854273d55918693d5364a1f2" | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "2.0.16" | |||
version: "2.2.2" | |||
shared_preferences_foundation: | |||
dependency: transitive | |||
description: | |||
name: shared_preferences_foundation | |||
sha256: "6b84fdf06b32bb336f972d373cd38b63734f3461ba56ac2ba01b56d052796259" | |||
sha256: "0a8a893bf4fd1152f93fec03a415d11c27c74454d96e2318a7ac38dd18683ab7" | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "2.1.4" | |||
version: "2.4.0" | |||
shared_preferences_linux: | |||
dependency: transitive | |||
description: | |||
name: shared_preferences_linux | |||
sha256: d7fb71e6e20cd3dfffcc823a28da3539b392e53ed5fc5c2b90b55fdaa8a7e8fa | |||
sha256: "9f2cbcf46d4270ea8be39fa156d86379077c8a5228d9dfdb1164ae0bb93f1faa" | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "2.1.4" | |||
version: "2.3.2" | |||
shared_preferences_platform_interface: | |||
dependency: transitive | |||
description: | |||
name: shared_preferences_platform_interface | |||
sha256: "824bfd02713e37603b2bdade0842e47d56e7db32b1dcdd1cae533fb88e2913fc" | |||
sha256: "22e2ecac9419b4246d7c22bfbbda589e3acf5c0351137d87dd2939d984d37c3b" | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "2.1.1" | |||
version: "2.3.2" | |||
shared_preferences_web: | |||
dependency: transitive | |||
description: | |||
name: shared_preferences_web | |||
sha256: "6737b757e49ba93de2a233df229d0b6a87728cea1684da828cbc718b65dcf9d7" | |||
sha256: "9aee1089b36bd2aafe06582b7d7817fd317ef05fc30e6ba14bff247d0933042a" | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "2.0.5" | |||
version: "2.3.0" | |||
shared_preferences_windows: | |||
dependency: transitive | |||
description: | |||
name: shared_preferences_windows | |||
sha256: bd014168e8484837c39ef21065b78f305810ceabc1d4f90be6e3b392ce81b46d | |||
sha256: "841ad54f3c8381c480d0c9b508b89a34036f512482c407e6df7a9c4aa2ef8f59" | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "2.1.4" | |||
version: "2.3.2" | |||
sky_engine: | |||
dependency: transitive | |||
description: flutter | |||
@@ -537,42 +545,50 @@ packages: | |||
dependency: transitive | |||
description: | |||
name: source_span | |||
sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 | |||
sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "1.9.1" | |||
version: "1.10.0" | |||
sprintf: | |||
dependency: transitive | |||
description: | |||
name: sprintf | |||
sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23" | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "7.0.0" | |||
sqflite: | |||
dependency: transitive | |||
description: | |||
name: sqflite | |||
sha256: "851d5040552cf911f4cabda08d003eca76b27da3ed0002978272e27c8fbf8ecc" | |||
sha256: a43e5a27235518c03ca238e7b4732cf35eabe863a369ceba6cbefa537a66f16d | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "2.2.5" | |||
version: "2.3.3+1" | |||
sqflite_common: | |||
dependency: transitive | |||
description: | |||
name: sqflite_common | |||
sha256: bfd6973aaeeb93475bc0d875ac9aefddf7965ef22ce09790eb963992ffc5183f | |||
sha256: "3da423ce7baf868be70e2c0976c28a1bb2f73644268b7ffa7d2e08eab71f16a4" | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "2.4.2+2" | |||
version: "2.5.4" | |||
stack_trace: | |||
dependency: transitive | |||
description: | |||
name: stack_trace | |||
sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 | |||
sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "1.11.0" | |||
version: "1.11.1" | |||
stream_channel: | |||
dependency: transitive | |||
description: | |||
name: stream_channel | |||
sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" | |||
sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "2.1.1" | |||
version: "2.1.2" | |||
string_scanner: | |||
dependency: transitive | |||
description: | |||
@@ -585,10 +601,10 @@ packages: | |||
dependency: transitive | |||
description: | |||
name: synchronized | |||
sha256: "33b31b6beb98100bf9add464a36a8dd03eb10c7a8cf15aeec535e9b054aaf04b" | |||
sha256: "539ef412b170d65ecdafd780f924e5be3f60032a1128df156adad6c5b373d558" | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "3.0.1" | |||
version: "3.1.0+1" | |||
term_glyph: | |||
dependency: transitive | |||
description: | |||
@@ -601,26 +617,26 @@ packages: | |||
dependency: transitive | |||
description: | |||
name: test_api | |||
sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206 | |||
sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "0.4.16" | |||
version: "0.6.1" | |||
typed_data: | |||
dependency: transitive | |||
description: | |||
name: typed_data | |||
sha256: "26f87ade979c47a150c9eaab93ccd2bebe70a27dc0b4b29517f2904f04eb11a5" | |||
sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "1.3.1" | |||
version: "1.3.2" | |||
uuid: | |||
dependency: transitive | |||
description: | |||
name: uuid | |||
sha256: "648e103079f7c64a36dc7d39369cabb358d377078a051d6ae2ad3aa539519313" | |||
sha256: "814e9e88f21a176ae1359149021870e87f7cddaf633ab678a5d2b0bff7fd1ba8" | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "3.0.7" | |||
version: "4.4.0" | |||
vector_math: | |||
dependency: transitive | |||
description: | |||
@@ -629,38 +645,54 @@ packages: | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "2.1.4" | |||
vm_service: | |||
dependency: transitive | |||
description: | |||
name: vm_service | |||
sha256: b3d56ff4341b8f182b96aceb2fa20e3dcb336b9f867bc0eafc0de10f1048e957 | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "13.0.0" | |||
web: | |||
dependency: transitive | |||
description: | |||
name: web | |||
sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27" | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "0.5.1" | |||
win32: | |||
dependency: transitive | |||
description: | |||
name: win32 | |||
sha256: c9ebe7ee4ab0c2194e65d3a07d8c54c5d00bb001b76081c4a04cdb8448b59e46 | |||
sha256: "0eaf06e3446824099858367950a813472af675116bf63f008a4c2a75ae13e9cb" | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "3.1.3" | |||
version: "5.5.0" | |||
xdg_directories: | |||
dependency: transitive | |||
description: | |||
name: xdg_directories | |||
sha256: ee1505df1426458f7f60aac270645098d318a8b4766d85fde75f76f2e21807d1 | |||
sha256: faea9dee56b520b55a566385b84f2e8de55e7496104adada9962e0bd11bcff1d | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "1.0.0" | |||
version: "1.0.4" | |||
xml: | |||
dependency: transitive | |||
description: | |||
name: xml | |||
sha256: "979ee37d622dec6365e2efa4d906c37470995871fe9ae080d967e192d88286b5" | |||
sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "6.2.2" | |||
version: "6.5.0" | |||
yaml: | |||
dependency: transitive | |||
description: | |||
name: yaml | |||
sha256: "23812a9b125b48d4007117254bca50abb6c712352927eece9e155207b1db2370" | |||
sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" | |||
url: "https://pub.dev" | |||
source: hosted | |||
version: "3.1.1" | |||
version: "3.1.2" | |||
sdks: | |||
dart: ">=2.18.0 <3.0.0" | |||
flutter: ">=3.3.0" | |||
dart: ">=3.3.0 <4.0.0" | |||
flutter: ">=3.19.0" |
@@ -7,6 +7,7 @@ dependencies: | |||
flutter: | |||
sdk: flutter | |||
get: ^4.6.5 | |||
flutter_dotenv: ^5.0.2 | |||
connectivity_plus: ^2.3.6 | |||
shared_preferences: ^2.0.15 | |||
cached_network_image: ^3.2.1 | |||
@@ -14,6 +15,7 @@ dependencies: | |||
flutter_switch: ^0.3.2 | |||
intl: ^0.17.0 | |||
file: ^6.1.4 | |||
dots_indicator: ^2.0.0 | |||
dev_dependencies: | |||
flutter_test: | |||
sdk: flutter | |||
@@ -22,7 +24,14 @@ flutter: | |||
uses-material-design: true | |||
assets: | |||
- assets/ | |||
- assets/images/ | |||
- assets/images/CookingLab-Top.jpg | |||
- assets/images/logo_a_fa.png | |||
- assets/images/img_rectangle286.png | |||
- assets/images/img1.png | |||
- assets/images/img2.png | |||
- assets/images/img3.png | |||
- assets/images/img_image1.png | |||
- assets/images/foto-CookingLab.jpeg | |||
fonts: | |||
- family: Roboto | |||
fonts: | |||