Browse Source

first commit

master
Gedion Daniel 1 year ago
parent
commit
c7df0d874f
26 changed files with 1269 additions and 576 deletions
  1. +17
    -17
      .flutter-plugins
  2. +1
    -1
      .flutter-plugins-dependencies
  3. +1
    -0
      .gitignore
  4. +1
    -1
      android/app/build.gradle
  5. +1
    -1
      android/build.gradle
  6. BIN
      assets/images/CookingLab-Top.jpg
  7. BIN
      assets/images/CookingLab-Top.png
  8. BIN
      assets/images/foto-CookingLab.jpeg
  9. BIN
      assets/images/img1.jpg
  10. BIN
      assets/images/img1.png
  11. BIN
      assets/images/img2.jpg
  12. BIN
      assets/images/img2.png
  13. BIN
      assets/images/img3.jpg
  14. BIN
      assets/images/img3.png
  15. BIN
      assets/images/img_rectangle286.jpg
  16. BIN
      assets/images/logo_a_fa.jpg
  17. +2
    -0
      lib/core/utils/image_constant.dart
  18. +2
    -2
      lib/core/utils/size_utils.dart
  19. +5
    -3
      lib/main.dart
  20. +253
    -0
      lib/presentation/camera_page/camera_page.dart
  21. +428
    -145
      lib/presentation/login_screen/login_screen.dart
  22. +307
    -83
      lib/presentation/splash_screen_one_screen/splash_screen_one_screen.dart
  23. +2
    -1
      lib/widgets/custom_image_view.dart
  24. +62
    -176
      lib/widgets/custom_text_form_field.dart
  25. +177
    -145
      pubspec.lock
  26. +10
    -1
      pubspec.yaml

+ 17
- 17
.flutter-plugins View File

@@ -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\\

+ 1
- 1
.flutter-plugins-dependencies
File diff suppressed because it is too large
View File


+ 1
- 0
.gitignore View File

@@ -6,3 +6,4 @@
!/.packages
!/.flutter-plugins-dependencies
!/.flutter-plugins
.env

+ 1
- 1
android/app/build.gradle View File

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


+ 1
- 1
android/build.gradle View File

@@ -26,6 +26,6 @@ subprojects {
project.evaluationDependsOn(':app')
}

task clean(type: Delete) {
tasks.register("clean", Delete) {
delete rootProject.buildDir
}

BIN
assets/images/CookingLab-Top.jpg View File

Before After
Width: 1811  |  Height: 536  |  Size: 30 KiB

BIN
assets/images/CookingLab-Top.png View File

Before After
Width: 1811  |  Height: 536  |  Size: 121 KiB

BIN
assets/images/foto-CookingLab.jpeg View File

Before After
Width: 1134  |  Height: 2016  |  Size: 80 KiB

BIN
assets/images/img1.jpg View File

Before After
Width: 3024  |  Height: 4032  |  Size: 2.9 MiB

BIN
assets/images/img1.png View File

Before After
Width: 362  |  Height: 537  |  Size: 32 KiB

BIN
assets/images/img2.jpg View File

Before After
Width: 4032  |  Height: 3024  |  Size: 3.1 MiB

BIN
assets/images/img2.png View File

Before After
Width: 724  |  Height: 537  |  Size: 13 KiB

BIN
assets/images/img3.jpg View File

Before After
Width: 3024  |  Height: 4032  |  Size: 3.4 MiB

BIN
assets/images/img3.png View File

Before After
Width: 723  |  Height: 534  |  Size: 66 KiB

BIN
assets/images/img_rectangle286.jpg View File

Before After
Width: 402  |  Height: 400  |  Size: 11 KiB

BIN
assets/images/logo_a_fa.jpg View File

Before After
Width: 149  |  Height: 147  |  Size: 4.8 KiB

+ 2
- 0
lib/core/utils/image_constant.dart View File

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

+ 2
- 2
lib/core/utils/size_utils.dart View File

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


+ 5
- 3
lib/main.dart View File

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



+ 253
- 0
lib/presentation/camera_page/camera_page.dart View File

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

+ 428
- 145
lib/presentation/login_screen/login_screen.dart View File

@@ -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;
}
}

+ 307
- 83
lib/presentation/splash_screen_one_screen/splash_screen_one_screen.dart View File

@@ -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;
}

+ 2
- 1
lib/widgets/custom_image_view.dart View File

@@ -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 {


+ 62
- 176
lib/widgets/custom_text_form_field.dart View File

@@ -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,
}

+ 177
- 145
pubspec.lock View File

@@ -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"

+ 10
- 1
pubspec.yaml View File

@@ -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:


Loading…
Cancel
Save