diff --git a/.flutter-plugins b/.flutter-plugins index cece6e6..a09f870 100644 --- a/.flutter-plugins +++ b/.flutter-plugins @@ -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\\ diff --git a/.flutter-plugins-dependencies b/.flutter-plugins-dependencies index 1408f69..6ddad90 100644 --- a/.flutter-plugins-dependencies +++ b/.flutter-plugins-dependencies @@ -1 +1 @@ -{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"connectivity_plus","path":"/home/micbook/.pub-cache/hosted/pub.dev/connectivity_plus-2.3.9/","native_build":true,"dependencies":[]},{"name":"path_provider_foundation","path":"/home/micbook/.pub-cache/hosted/pub.dev/path_provider_foundation-2.1.2/","native_build":true,"dependencies":[]},{"name":"shared_preferences_foundation","path":"/home/micbook/.pub-cache/hosted/pub.dev/shared_preferences_foundation-2.1.4/","native_build":true,"dependencies":[]},{"name":"sqflite","path":"/home/micbook/.pub-cache/hosted/pub.dev/sqflite-2.2.5/","native_build":true,"dependencies":[]}],"android":[{"name":"connectivity_plus","path":"/home/micbook/.pub-cache/hosted/pub.dev/connectivity_plus-2.3.9/","native_build":true,"dependencies":[]},{"name":"path_provider_android","path":"/home/micbook/.pub-cache/hosted/pub.dev/path_provider_android-2.0.23/","native_build":true,"dependencies":[]},{"name":"shared_preferences_android","path":"/home/micbook/.pub-cache/hosted/pub.dev/shared_preferences_android-2.0.16/","native_build":true,"dependencies":[]},{"name":"sqflite","path":"/home/micbook/.pub-cache/hosted/pub.dev/sqflite-2.2.5/","native_build":true,"dependencies":[]}],"macos":[{"name":"connectivity_plus_macos","path":"/home/micbook/.pub-cache/hosted/pub.dev/connectivity_plus_macos-1.2.6/","native_build":true,"dependencies":[]},{"name":"path_provider_foundation","path":"/home/micbook/.pub-cache/hosted/pub.dev/path_provider_foundation-2.1.2/","native_build":true,"dependencies":[]},{"name":"shared_preferences_foundation","path":"/home/micbook/.pub-cache/hosted/pub.dev/shared_preferences_foundation-2.1.4/","native_build":true,"dependencies":[]},{"name":"sqflite","path":"/home/micbook/.pub-cache/hosted/pub.dev/sqflite-2.2.5/","native_build":true,"dependencies":[]}],"linux":[{"name":"connectivity_plus_linux","path":"/home/micbook/.pub-cache/hosted/pub.dev/connectivity_plus_linux-1.3.1/","native_build":false,"dependencies":[]},{"name":"path_provider_linux","path":"/home/micbook/.pub-cache/hosted/pub.dev/path_provider_linux-2.1.9/","native_build":false,"dependencies":[]},{"name":"shared_preferences_linux","path":"/home/micbook/.pub-cache/hosted/pub.dev/shared_preferences_linux-2.1.4/","native_build":false,"dependencies":["path_provider_linux"]}],"windows":[{"name":"connectivity_plus_windows","path":"/home/micbook/.pub-cache/hosted/pub.dev/connectivity_plus_windows-1.2.2/","native_build":true,"dependencies":[]},{"name":"path_provider_windows","path":"/home/micbook/.pub-cache/hosted/pub.dev/path_provider_windows-2.1.4/","native_build":false,"dependencies":[]},{"name":"shared_preferences_windows","path":"/home/micbook/.pub-cache/hosted/pub.dev/shared_preferences_windows-2.1.4/","native_build":false,"dependencies":["path_provider_windows"]}],"web":[{"name":"connectivity_plus_web","path":"/home/micbook/.pub-cache/hosted/pub.dev/connectivity_plus_web-1.2.5/","dependencies":[]},{"name":"shared_preferences_web","path":"/home/micbook/.pub-cache/hosted/pub.dev/shared_preferences_web-2.0.5/","dependencies":[]}]},"dependencyGraph":[{"name":"connectivity_plus","dependencies":["connectivity_plus_linux","connectivity_plus_macos","connectivity_plus_web","connectivity_plus_windows"]},{"name":"connectivity_plus_linux","dependencies":[]},{"name":"connectivity_plus_macos","dependencies":[]},{"name":"connectivity_plus_web","dependencies":[]},{"name":"connectivity_plus_windows","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_android","path_provider_foundation","path_provider_linux","path_provider_windows"]},{"name":"path_provider_android","dependencies":[]},{"name":"path_provider_foundation","dependencies":[]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_windows","dependencies":[]},{"name":"shared_preferences","dependencies":["shared_preferences_android","shared_preferences_foundation","shared_preferences_linux","shared_preferences_web","shared_preferences_windows"]},{"name":"shared_preferences_android","dependencies":[]},{"name":"shared_preferences_foundation","dependencies":[]},{"name":"shared_preferences_linux","dependencies":["path_provider_linux"]},{"name":"shared_preferences_web","dependencies":[]},{"name":"shared_preferences_windows","dependencies":["path_provider_windows"]},{"name":"sqflite","dependencies":[]}],"date_created":"2023-03-07 15:37:57.534826","version":"3.7.6"} \ No newline at end of file +{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"connectivity_plus","path":"C:\\\\Users\\\\HP\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\connectivity_plus-2.3.9\\\\","native_build":true,"dependencies":[]},{"name":"path_provider_foundation","path":"C:\\\\Users\\\\HP\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\path_provider_foundation-2.4.0\\\\","shared_darwin_source":true,"native_build":true,"dependencies":[]},{"name":"shared_preferences_foundation","path":"C:\\\\Users\\\\HP\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\shared_preferences_foundation-2.4.0\\\\","shared_darwin_source":true,"native_build":true,"dependencies":[]},{"name":"sqflite","path":"C:\\\\Users\\\\HP\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\sqflite-2.3.3+1\\\\","shared_darwin_source":true,"native_build":true,"dependencies":[]}],"android":[{"name":"connectivity_plus","path":"C:\\\\Users\\\\HP\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\connectivity_plus-2.3.9\\\\","native_build":true,"dependencies":[]},{"name":"path_provider_android","path":"C:\\\\Users\\\\HP\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\path_provider_android-2.2.4\\\\","native_build":true,"dependencies":[]},{"name":"shared_preferences_android","path":"C:\\\\Users\\\\HP\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\shared_preferences_android-2.2.2\\\\","native_build":true,"dependencies":[]},{"name":"sqflite","path":"C:\\\\Users\\\\HP\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\sqflite-2.3.3+1\\\\","native_build":true,"dependencies":[]}],"macos":[{"name":"connectivity_plus_macos","path":"C:\\\\Users\\\\HP\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\connectivity_plus_macos-1.2.6\\\\","native_build":true,"dependencies":[]},{"name":"path_provider_foundation","path":"C:\\\\Users\\\\HP\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\path_provider_foundation-2.4.0\\\\","shared_darwin_source":true,"native_build":true,"dependencies":[]},{"name":"shared_preferences_foundation","path":"C:\\\\Users\\\\HP\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\shared_preferences_foundation-2.4.0\\\\","shared_darwin_source":true,"native_build":true,"dependencies":[]},{"name":"sqflite","path":"C:\\\\Users\\\\HP\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\sqflite-2.3.3+1\\\\","shared_darwin_source":true,"native_build":true,"dependencies":[]}],"linux":[{"name":"connectivity_plus_linux","path":"C:\\\\Users\\\\HP\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\connectivity_plus_linux-1.3.1\\\\","native_build":false,"dependencies":[]},{"name":"path_provider_linux","path":"C:\\\\Users\\\\HP\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\path_provider_linux-2.2.1\\\\","native_build":false,"dependencies":[]},{"name":"shared_preferences_linux","path":"C:\\\\Users\\\\HP\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\shared_preferences_linux-2.3.2\\\\","native_build":false,"dependencies":["path_provider_linux"]}],"windows":[{"name":"connectivity_plus_windows","path":"C:\\\\Users\\\\HP\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\connectivity_plus_windows-1.2.2\\\\","native_build":true,"dependencies":[]},{"name":"path_provider_windows","path":"C:\\\\Users\\\\HP\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\path_provider_windows-2.2.1\\\\","native_build":false,"dependencies":[]},{"name":"shared_preferences_windows","path":"C:\\\\Users\\\\HP\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\shared_preferences_windows-2.3.2\\\\","native_build":false,"dependencies":["path_provider_windows"]}],"web":[{"name":"connectivity_plus_web","path":"C:\\\\Users\\\\HP\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\connectivity_plus_web-1.2.5\\\\","dependencies":[]},{"name":"shared_preferences_web","path":"C:\\\\Users\\\\HP\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\shared_preferences_web-2.3.0\\\\","dependencies":[]}]},"dependencyGraph":[{"name":"connectivity_plus","dependencies":["connectivity_plus_linux","connectivity_plus_macos","connectivity_plus_web","connectivity_plus_windows"]},{"name":"connectivity_plus_linux","dependencies":[]},{"name":"connectivity_plus_macos","dependencies":[]},{"name":"connectivity_plus_web","dependencies":[]},{"name":"connectivity_plus_windows","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_android","path_provider_foundation","path_provider_linux","path_provider_windows"]},{"name":"path_provider_android","dependencies":[]},{"name":"path_provider_foundation","dependencies":[]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_windows","dependencies":[]},{"name":"shared_preferences","dependencies":["shared_preferences_android","shared_preferences_foundation","shared_preferences_linux","shared_preferences_web","shared_preferences_windows"]},{"name":"shared_preferences_android","dependencies":[]},{"name":"shared_preferences_foundation","dependencies":[]},{"name":"shared_preferences_linux","dependencies":["path_provider_linux"]},{"name":"shared_preferences_web","dependencies":[]},{"name":"shared_preferences_windows","dependencies":["path_provider_windows"]},{"name":"sqflite","dependencies":[]}],"date_created":"2024-06-26 13:56:54.131323","version":"3.19.6"} \ No newline at end of file diff --git a/.gitignore b/.gitignore index 39ebb3c..7fb5ff4 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ !/.packages !/.flutter-plugins-dependencies !/.flutter-plugins +.env diff --git a/android/app/build.gradle b/android/app/build.gradle index 2810ff9..5370d7c 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -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' diff --git a/android/build.gradle b/android/build.gradle index 9cb9fa6..3618d64 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -26,6 +26,6 @@ subprojects { project.evaluationDependsOn(':app') } -task clean(type: Delete) { +tasks.register("clean", Delete) { delete rootProject.buildDir } diff --git a/assets/images/CookingLab-Top.jpg b/assets/images/CookingLab-Top.jpg new file mode 100644 index 0000000..e24e73e Binary files /dev/null and b/assets/images/CookingLab-Top.jpg differ diff --git a/assets/images/CookingLab-Top.png b/assets/images/CookingLab-Top.png new file mode 100644 index 0000000..638229a Binary files /dev/null and b/assets/images/CookingLab-Top.png differ diff --git a/assets/images/foto-CookingLab.jpeg b/assets/images/foto-CookingLab.jpeg new file mode 100644 index 0000000..cb713c4 Binary files /dev/null and b/assets/images/foto-CookingLab.jpeg differ diff --git a/assets/images/img1.jpg b/assets/images/img1.jpg new file mode 100644 index 0000000..bba7be3 Binary files /dev/null and b/assets/images/img1.jpg differ diff --git a/assets/images/img1.png b/assets/images/img1.png new file mode 100644 index 0000000..d4a0131 Binary files /dev/null and b/assets/images/img1.png differ diff --git a/assets/images/img2.jpg b/assets/images/img2.jpg new file mode 100644 index 0000000..77b516f Binary files /dev/null and b/assets/images/img2.jpg differ diff --git a/assets/images/img2.png b/assets/images/img2.png new file mode 100644 index 0000000..afd2368 Binary files /dev/null and b/assets/images/img2.png differ diff --git a/assets/images/img3.jpg b/assets/images/img3.jpg new file mode 100644 index 0000000..539de1a Binary files /dev/null and b/assets/images/img3.jpg differ diff --git a/assets/images/img3.png b/assets/images/img3.png new file mode 100644 index 0000000..d37d854 Binary files /dev/null and b/assets/images/img3.png differ diff --git a/assets/images/img_rectangle286.jpg b/assets/images/img_rectangle286.jpg new file mode 100644 index 0000000..7af873f Binary files /dev/null and b/assets/images/img_rectangle286.jpg differ diff --git a/assets/images/logo_a_fa.jpg b/assets/images/logo_a_fa.jpg new file mode 100644 index 0000000..1316d40 Binary files /dev/null and b/assets/images/logo_a_fa.jpg differ diff --git a/lib/core/utils/image_constant.dart b/lib/core/utils/image_constant.dart index 6f33327..cf6ae0a 100644 --- a/lib/core/utils/image_constant.dart +++ b/lib/core/utils/image_constant.dart @@ -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'; } diff --git a/lib/core/utils/size_utils.dart b/lib/core/utils/size_utils.dart index 21cb2f0..2d4b6bd 100644 --- a/lib/core/utils/size_utils.dart +++ b/lib/core/utils/size_utils.dart @@ -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; diff --git a/lib/main.dart b/lib/main.dart index 91a502e..93ca2e7 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -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()); }); } diff --git a/lib/presentation/camera_page/camera_page.dart b/lib/presentation/camera_page/camera_page.dart new file mode 100644 index 0000000..b5cd84d --- /dev/null +++ b/lib/presentation/camera_page/camera_page.dart @@ -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 createHttpClient() async { + final ioc = HttpClient() + ..badCertificateCallback = + (X509Certificate cert, String host, int port) => true; + return IOClient(ioc); + } + + Future 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 sendPostRequestMoveCamera( + BuildContext context, String token, Map 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, + ); + } +} diff --git a/lib/presentation/login_screen/login_screen.dart b/lib/presentation/login_screen/login_screen.dart index 5cc141c..743bdad 100644 --- a/lib/presentation/login_screen/login_screen.dart +++ b/lib/presentation/login_screen/login_screen.dart @@ -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 { +import 'package:flutter_dotenv/flutter_dotenv.dart'; + +class LoginScreen extends StatefulWidget { + @override + _LoginScreenState createState() => _LoginScreenState(); +} + +class _LoginScreenState extends State { GlobalKey _formKey = GlobalKey(); + 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 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 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 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 sendPostRequestStart(String token, Map data, String time, String camNumber) async { + var url = Uri.parse('https://192.168.60.230:5050/start-recording'); + List 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 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; } } diff --git a/lib/presentation/splash_screen_one_screen/splash_screen_one_screen.dart b/lib/presentation/splash_screen_one_screen/splash_screen_one_screen.dart index 0cbb3f5..f80279e 100644 --- a/lib/presentation/splash_screen_one_screen/splash_screen_one_screen.dart +++ b/lib/presentation/splash_screen_one_screen/splash_screen_one_screen.dart @@ -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 { +// @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 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( +// 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 with AutomaticKeepAliveClientMixin { + final controller = PageController(); + Timer? _timer; + double currentPage = 0; + + // Add your image paths here + final List imagePaths = [ + 'assets/images/foto-CookingLab.jpeg', + 'assets/images/img2.png', + 'assets/images/img3.png', + ]; + + // Add your text here + final List 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 { @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( + 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; +} \ No newline at end of file diff --git a/lib/widgets/custom_image_view.dart b/lib/widgets/custom_image_view.dart index c4d7ee6..4a92482 100644 --- a/lib/widgets/custom_image_view.dart +++ b/lib/widgets/custom_image_view.dart @@ -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 { diff --git a/lib/widgets/custom_text_form_field.dart b/lib/widgets/custom_text_form_field.dart index 6c343f5..cf05029 100644 --- a/lib/widgets/custom_text_form_field.dart +++ b/lib/widgets/custom_text_form_field.dart @@ -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? 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? 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, } diff --git a/pubspec.lock b/pubspec.lock index daed4d5..ce410a6 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -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" diff --git a/pubspec.yaml b/pubspec.yaml index 97335f8..81fb7a4 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -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: