c90Beretta преди 5 месеца
родител
ревизия
f841feddab

+ 3 - 0
devtools_options.yaml

@@ -0,0 +1,3 @@
+description: This file stores settings for Dart & Flutter DevTools.
+documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states
+extensions:

+ 1 - 0
ios/Flutter/Debug.xcconfig

@@ -1 +1,2 @@
+#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
 #include "Generated.xcconfig"

+ 1 - 0
ios/Flutter/Release.xcconfig

@@ -1 +1,2 @@
+#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
 #include "Generated.xcconfig"

+ 44 - 0
ios/Podfile

@@ -0,0 +1,44 @@
+# Uncomment this line to define a global platform for your project
+# platform :ios, '12.0'
+
+# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
+ENV['COCOAPODS_DISABLE_STATS'] = 'true'
+
+project 'Runner', {
+  'Debug' => :debug,
+  'Profile' => :release,
+  'Release' => :release,
+}
+
+def flutter_root
+  generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)
+  unless File.exist?(generated_xcode_build_settings_path)
+    raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first"
+  end
+
+  File.foreach(generated_xcode_build_settings_path) do |line|
+    matches = line.match(/FLUTTER_ROOT\=(.*)/)
+    return matches[1].strip if matches
+  end
+  raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get"
+end
+
+require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
+
+flutter_ios_podfile_setup
+
+target 'Runner' do
+  use_frameworks!
+  use_modular_headers!
+
+  flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
+  target 'RunnerTests' do
+    inherit! :search_paths
+  end
+end
+
+post_install do |installer|
+  installer.pods_project.targets.each do |target|
+    flutter_additional_ios_build_settings(target)
+  end
+end

+ 2 - 2
lib/data/api_response.dart

@@ -30,8 +30,8 @@ class ApiResponse {
     }
     if (body.containsKey('resultado') && body["resultado"] != null) {
       resultados = (body['resultado'] as List<dynamic>)
-        .cast<Map<String, dynamic>>()
-        .toList();
+          .cast<Map<String, dynamic>>()
+          .toList();
     }
     if (body.containsKey('detalle')) {
       detalle = body['detalle'];

+ 2 - 0
lib/main.dart

@@ -1,6 +1,7 @@
 //import 'package:fluent_ui/fluent_ui.dart';
 import 'package:flutter/material.dart';
 import 'package:provider/provider.dart';
+import 'package:sis_flutter/viewmodels/tarea_view_mode.dart';
 import '../themes/themes.dart';
 import 'views/home/home_screen.dart';
 import 'views/login/login_screen.dart';
@@ -19,6 +20,7 @@ void main() {
     ChangeNotifierProvider(create: (_) => UsuariosViewModel()),
     ChangeNotifierProvider(create: (_) => AdministracionViewModel()),
     ChangeNotifierProvider(create: (_) => MediaViewModel()),
+    ChangeNotifierProvider(create: (_) => PrioridadesViewMode()),
   ], child: const MyApp()));
 }
 

+ 3 - 3
lib/models/basico_model.dart

@@ -3,14 +3,14 @@ class Basico {
   static const String identificadorLocal = "idLocal";
   static const String identificadorWeb = "id";
 
-  int id;
+  String id;
   int idLocal;
   DateTime? creado;
   DateTime? modificado;
   DateTime? eliminado;
 
   Basico({
-    this.id = 0,
+    this.id = '',
     this.idLocal = -1,
     this.creado,
     this.modificado,
@@ -70,7 +70,7 @@ class Basico {
   }
 
   parseJson(Map<String, dynamic> json) {
-    id = json['id'] != null ? int.parse(json['id'].toString()) : 0;
+    id = json['id'] ?? '';
     idLocal = json['idLocal'] ?? -1;
     eliminado = parseDate(json['eliminado']);
     creado = parseDate(json['creado']);

+ 127 - 0
lib/models/tarea_model.dart

@@ -0,0 +1,127 @@
+// ignore_for_file: constant_identifier_names
+
+import 'package:sis_flutter/models/models.dart';
+
+class PrioridadesPersonaResponse extends Basico {
+  final List<Detalle> detalle;
+
+  PrioridadesPersonaResponse({
+    required this.detalle,
+  });
+}
+
+class Detalle extends Basico {
+  final String? nombre;
+  final String? avance;
+  final List<Tarea>? tareas;
+  final int? prioridad;
+  final String? nombreProyecto;
+  final String? idProyecto;
+
+  Detalle({
+    super.id,
+    this.nombre,
+    this.avance,
+    this.tareas,
+    this.prioridad,
+    this.nombreProyecto,
+    this.idProyecto,
+  });
+
+  factory Detalle.fromJson(Map<String, dynamic> json) {
+    return Detalle(
+      id: Basico.parseString(json["id"]),
+      nombre: Basico.parseString(json["nombre"]),
+      avance: Basico.parseString(json["avance"]),
+      tareas: (json["tareasPendientes"] as List)
+          .map((e) => Tarea.fromJson(e))
+          .toList()
+          .cast(),
+      prioridad: Basico.parseInt(json["prioridad"]),
+      nombreProyecto: Basico.parseString(json["nombreProyecto"]),
+      idProyecto: Basico.parseString(json["idProyecto"]),
+    );
+  }
+}
+
+class Tarea extends Basico {
+  final int? idActividad;
+  final String? idUsuario;
+  final String? contenido;
+  final String? idTareaPadre;
+  final DateTime? terminado;
+  final int? posicion;
+  final String? urgencia;
+  final String? idCreador;
+  final String? testing;
+  final String? iops;
+  final String? soporte;
+  final int? prioridad;
+
+  Tarea({
+    super.id,
+    super.creado,
+    super.idLocal,
+    super.eliminado,
+    super.modificado,
+    this.idActividad,
+    this.idUsuario,
+    this.contenido,
+    this.idTareaPadre,
+    this.terminado,
+    this.posicion,
+    this.urgencia,
+    this.idCreador,
+    this.testing,
+    this.iops,
+    this.soporte,
+    this.prioridad,
+  });
+
+  factory Tarea.fromJson(Map<String, dynamic> json) {
+    return Tarea(
+      id: Basico.parseString("${json["id"]}"),
+      idActividad: Basico.parseInt(json["id_actividad"]),
+      idUsuario: Basico.parseString(json["id_usuario"]),
+      contenido: Basico.parseString(json["contenido"]),
+      idTareaPadre: Basico.parseString(json["id_tarea_padre"]),
+      terminado: Basico.parseDate(json["terminado"]),
+      posicion: Basico.parseInt(json["posicion"]),
+      urgencia: Basico.parseString(json["urgencia"]),
+      creado: Basico.parseDate(json["creado"]),
+      eliminado: Basico.parseDate(json["eliminado"]),
+      idCreador: Basico.parseString(json["idCreador"]),
+      testing: Basico.parseString(json["testing"]),
+      iops: Basico.parseString(json["iops"]),
+      soporte: Basico.parseString(json["soporte"]),
+      prioridad: Basico.parseInt(json["prioridad"]),
+    );
+  }
+
+  // @override
+  // Map<String, dynamic> toJson() => {
+  //       "id": id,
+  //       "id_actividad": idActividad,
+  //       "id_usuario": idUsuario,
+  //       "contenido": contenido,
+  //       "id_tarea_padre": idTareaPadre,
+  //       "terminado": terminado,
+  //       "posicion": posicion,
+  //       "urgencia": urgencia,
+  //       "creado": creado,
+  //       "eliminado": eliminado,
+  //       "id_creador": idCreador,
+  //       "testing": testing,
+  //       "iops": iops,
+  //       "soporte": soporte,
+  //       "prioridad": prioridad,
+  //     };
+}
+
+enum IdCreador {
+  F37_BCVRLNFRDHCH,
+  THE_38_L81_SK35_CNDGB2,
+  THE_4_MGE9_AJMCDM6_ASV
+}
+
+enum Iops { DEFAULT }

+ 55 - 0
lib/services/tarea_service.dart

@@ -0,0 +1,55 @@
+import 'dart:convert';
+
+import 'package:sis_flutter/data/api_response.dart';
+import 'package:sis_flutter/models/tarea_model.dart';
+import 'package:sis_flutter/services/base_service.dart';
+
+class PrioridadesService extends BaseService {
+  final endpoint = "/v1/actividad/prioridades";
+
+  Future<List<Tarea>> getPrioridades(String idUsuario) async {
+    var r = await get(endpoint, headers: {
+      'Content-Type': 'application/json'
+    }, queryParameters: {
+      'usuario': idUsuario,
+    });
+
+    var body = jsonDecode(r.body);
+    var detalle = (body['detalle'] as List<dynamic>)
+        .cast<Map<String, dynamic>>()
+        .toList();
+
+    final List<Tarea> prioridades = [];
+    if (r.statusCode == 200) {
+      for (var i in detalle) {
+        Tarea tareasPendiente = Tarea.fromJson(i);
+        prioridades.add(tareasPendiente);
+      }
+    }
+
+    return prioridades;
+  }
+
+  Future<List<Detalle>> getDetalle(String idUsuario) async {
+    var r = await get(endpoint, headers: {
+      'Content-Type': 'application/json'
+    }, queryParameters: {
+      'usuario': idUsuario,
+    });
+
+    var body = jsonDecode(r.body);
+    var detalle = (body['detalle'] as List<dynamic>)
+        .cast<Map<String, dynamic>>()
+        .toList();
+
+    final List<Detalle> prioridades = [];
+    if (r.statusCode == 200) {
+      for (var i in detalle) {
+        Detalle detalle = Detalle.fromJson(i);
+        prioridades.add(detalle);
+      }
+    }
+
+    return prioridades;
+  }
+}

+ 104 - 39
lib/themes/themes.dart

@@ -1,47 +1,112 @@
 import 'package:flutter/material.dart';
-import 'package:flutter/services.dart';
 
 class AppTheme {
-  static Color primary = Color(0xFF1E8298);
-  static Color secondary = Colors.black;
-  static Color tertiary = const Color(0xFF060000);
-  static ThemeData lightTheme = ThemeData.light().copyWith(
-    useMaterial3: true,
-    //Scaffold
-    scaffoldBackgroundColor: Colors.grey[300],
-    //Tema de AppBar
-    appBarTheme: AppBarTheme(
-      color: primary,
-      foregroundColor: secondary,
-      systemOverlayStyle: SystemUiOverlayStyle(
-        statusBarColor: primary,
-        statusBarIconBrightness: Brightness.dark,
-      ),
-      iconTheme: IconThemeData(
-        color: secondary,
-      ),
+  // Colors
+  static const Color primary = Color(0xFF1A73E8); // Blue accent
+  static const Color secondary = Color(0xFFF6A14C); // Orange for icons
+  static const Color background = Colors.white;
+  static const Color surface = Colors.white;
+  static const Color textPrimary = Color(0xFF202124);
+  static const Color textSecondary = Color(0xFF5F6368);
+  static const Color divider = Color(0xFFE8EAED);
+  static const Color progressBackground = Color(0xFFE8EAED);
+
+  // Text Styles
+  static const TextTheme textTheme = TextTheme(
+    displayLarge: TextStyle(
+      fontSize: 24,
+      fontWeight: FontWeight.bold,
+      color: textPrimary,
     ),
-    //Tema de floatingActionButton
-    floatingActionButtonTheme: FloatingActionButtonThemeData(
-      backgroundColor: primary,
-      foregroundColor: secondary,
+    titleLarge: TextStyle(
+      fontSize: 18,
+      fontWeight: FontWeight.w600,
+      color: textPrimary,
     ),
-    //Tema de progressIndicator
-    progressIndicatorTheme: ProgressIndicatorThemeData(color: tertiary),
-    //Tema de DatePicker
-    datePickerTheme: DatePickerThemeData(
-      inputDecorationTheme: InputDecorationTheme(
-          //labelStyle: GoogleFonts.greatVibes(), // Input label
-          ),
-      backgroundColor: const Color(0xFFDBDBDB), //secondary,
-      headerBackgroundColor: primary,
-      todayBackgroundColor:
-          const MaterialStatePropertyAll(Color(0xFFDBDBDB)), //primary
-      todayForegroundColor:
-          const MaterialStatePropertyAll(Color.fromARGB(255, 0, 0, 0)),
-      rangePickerBackgroundColor: secondary,
-      // dayOverlayColor: MaterialStatePropertyAll(primary),
-      //headerHelpStyle: const TextStyle(fontSize: 18),
+    titleMedium: TextStyle(
+      fontSize: 16,
+      fontWeight: FontWeight.w500,
+      color: textPrimary,
+    ),
+    bodyLarge: TextStyle(
+      fontSize: 16,
+      color: textPrimary,
+    ),
+    bodyMedium: TextStyle(
+      fontSize: 14,
+      color: textSecondary,
     ),
   );
+
+  static ThemeData get lightTheme {
+    return ThemeData(
+      useMaterial3: true,
+      colorScheme: const ColorScheme.light(
+        primary: primary,
+        secondary: secondary,
+        surface: surface,
+        onPrimary: Colors.white,
+        onSecondary: Colors.white,
+        onSurface: textPrimary,
+      ),
+
+      // Text Theme
+      textTheme: textTheme,
+
+      // AppBar Theme
+      appBarTheme: const AppBarTheme(
+        backgroundColor: background,
+        elevation: 0,
+        centerTitle: false,
+        titleTextStyle: TextStyle(
+          color: textPrimary,
+          fontSize: 20,
+          fontWeight: FontWeight.w600,
+        ),
+        iconTheme: IconThemeData(color: textPrimary),
+      ),
+
+      // Card Theme
+      cardTheme: CardTheme(
+        elevation: 0,
+        shape: RoundedRectangleBorder(
+          borderRadius: BorderRadius.circular(12),
+          side: const BorderSide(color: divider),
+        ),
+        color: surface,
+      ),
+
+      // Button Theme
+      elevatedButtonTheme: ElevatedButtonThemeData(
+        style: ElevatedButton.styleFrom(
+          backgroundColor: primary,
+          foregroundColor: Colors.white,
+          elevation: 0,
+          padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 12),
+          shape: RoundedRectangleBorder(
+            borderRadius: BorderRadius.circular(8),
+          ),
+        ),
+      ),
+
+      // Progress Indicator Theme
+      progressIndicatorTheme: const ProgressIndicatorThemeData(
+        color: primary,
+        linearTrackColor: progressBackground,
+      ),
+
+      // Divider Theme
+      dividerTheme: const DividerThemeData(
+        color: divider,
+        space: 1,
+        thickness: 1,
+      ),
+
+      // Icon Theme
+      iconTheme: const IconThemeData(
+        color: secondary,
+        size: 24,
+      ),
+    );
+  }
 }

+ 27 - 0
lib/viewmodels/tarea_view_mode.dart

@@ -0,0 +1,27 @@
+import 'package:flutter/material.dart';
+
+import 'package:sis_flutter/models/tarea_model.dart';
+import 'package:sis_flutter/services/tarea_service.dart';
+
+class PrioridadesViewMode extends ChangeNotifier {
+  List<Tarea> _prioridades = [];
+  List<Tarea> get prioridades => _prioridades;
+
+  List<Detalle> _detalle = [];
+  List<Detalle> get detalle => _detalle;
+
+  Future<List<Tarea>> fetchPriodidades(idUsuario) async {
+    final prioridadesdata =
+        await PrioridadesService().getPrioridades(idUsuario);
+    _prioridades = prioridadesdata;
+    notifyListeners();
+    return _prioridades;
+  }
+
+  Future<List<Detalle>> fetchDetalle(idUsuario) async {
+    final detalledata = await PrioridadesService().getDetalle(idUsuario);
+    _detalle = detalledata;
+    notifyListeners();
+    return _detalle;
+  }
+}

+ 129 - 20
lib/views/home/home_screen.dart

@@ -1,12 +1,11 @@
 import 'package:flutter/material.dart';
-import '../../viewmodels/viewmodels.dart';
-import '/models/models.dart';
-import '/widgets/widgets.dart';
-import 'package:intl/intl.dart';
-import 'package:omni_datetime_picker/omni_datetime_picker.dart';
 import 'package:provider/provider.dart';
+import 'package:sis_flutter/models/tarea_model.dart';
 
-import '/widgets/widgets_components.dart' as clase;
+import 'package:sis_flutter/viewmodels/login_view_model.dart';
+import 'package:sis_flutter/viewmodels/tarea_view_mode.dart';
+import 'package:sis_flutter/widgets/app_drawer.dart';
+import 'package:sis_flutter/widgets/widgets_components.dart';
 
 class HomeScreen extends StatefulWidget {
   static const String route = '/home';
@@ -22,8 +21,7 @@ class Formulario extends State<HomeScreen> {
   DateTime? fechaFin;
   ScrollController horizontalScrollController = ScrollController();
   ScrollController verticalScrollController = ScrollController();
-  TextEditingController _tipo = TextEditingController(text: 'AUTOTANQUE');
-  final _busquedaEmpresa = TextEditingController();
+
   @override
   void initState() {
     super.initState();
@@ -31,24 +29,135 @@ class Formulario extends State<HomeScreen> {
 
   @override
   Widget build(BuildContext context) {
-    double screenWidth = MediaQuery.of(context).size.width;
-    final isMobile = screenWidth < 1000;
-    final double? columnSpacing = isMobile ? null : 0;
-    String nombre = Provider.of<LoginViewModel>(context).nombre;
-    String correo = Provider.of<LoginViewModel>(context).correo;
-    TextStyle estilo =
-        const TextStyle(fontWeight: FontWeight.bold, fontSize: 9);
-    TextStyle estiloNumero =
-        const TextStyle(fontWeight: FontWeight.bold, fontSize: 22);
-    var tvm = Provider.of<AdministracionViewModel>(context);
-
     return Scaffold(
       backgroundColor: Colors.grey.shade200,
       drawer: AppDrawer(),
       appBar: encabezado(
+        acciones: [
+          IconButton(
+              onPressed: () {}, icon: const Icon(Icons.restart_alt_rounded)),
+        ],
         titulo: 'Inicio',
       ),
-      body: Column(children: []),
+      body: const Bodytest(),
+    );
+  }
+}
+
+class Bodytest extends StatefulWidget {
+  const Bodytest({
+    super.key,
+  });
+
+  @override
+  State<Bodytest> createState() => _BodytestState();
+}
+
+class _BodytestState extends State<Bodytest> {
+  @override
+  void initState() {
+    super.initState();
+    Future(
+      () async {
+        final idusuario =
+            Provider.of<LoginViewModel>(context, listen: false).idUsuario;
+
+        Provider.of<PrioridadesViewMode>(context, listen: false)
+            .fetchPriodidades(idusuario);
+
+        Provider.of<PrioridadesViewMode>(context, listen: false)
+            .fetchDetalle(idusuario);
+      },
     );
   }
+
+  @override
+  void dispose() {
+    super.dispose();
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    var vm = Provider.of<PrioridadesViewMode>(context);
+    var prioridades = vm.prioridades;
+    var detalles = vm.detalle;
+
+    return SingleChildScrollView(
+      child: Column(
+        mainAxisAlignment: MainAxisAlignment.start,
+        children: [
+          SizedBox(
+              height: 500,
+              child: ListView.builder(
+                  itemCount: detalles.length,
+                  itemBuilder: (context, index) {
+                    var detalle = detalles[index];
+                    var prioridad = prioridades[index];
+                    return _infoCard(prioridad, detalle);
+                  })),
+        ],
+      ),
+    );
+  }
+
+  Card _infoCard(Tarea prioridad, Detalle detalle) {
+    print(detalle);
+    print(detalle.nombreProyecto);
+    print(detalle.nombre);
+    return Card(
+      margin: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 8),
+      elevation: 4,
+      shape: BeveledRectangleBorder(borderRadius: BorderRadius.circular(6.0)),
+      child: ExpansionTile(
+        backgroundColor: Colors.white24,
+        leading: const Icon(Icons.local_fire_department_rounded),
+        title: Text(
+          //!detalle nombre
+          "${detalle.nombreProyecto!} - ${detalle.nombre!}",
+          style: const TextStyle(fontSize: 20),
+          strutStyle: const StrutStyle(fontWeight: FontWeight.bold),
+        ),
+        trailing: const Icon(Icons.arrow_drop_down),
+        subtitle: Row(
+          mainAxisAlignment: MainAxisAlignment.start,
+          crossAxisAlignment: CrossAxisAlignment.center,
+          children: [
+            Text(detalle.avance!),
+            const SizedBox(
+                width:
+                    10), // Añadir espacio entre el texto y el indicador de progreso
+            Expanded(
+              child: ClipRRect(
+                borderRadius: BorderRadius.all(Radius.circular(10)),
+                child: LinearProgressIndicator(
+                  value: double.parse(detalle.avance!) / 100,
+                  backgroundColor: Colors.grey,
+                  valueColor: AlwaysStoppedAnimation<Color>(
+                    _calcularColorPorcentaje(detalle.avance!),
+                  ),
+                ),
+              ),
+            ),
+          ],
+        ),
+        children: [
+          ListTile(
+            title: Text(prioridad.id),
+            subtitle: Text("Subtarea 1"),
+          ),
+          ListTile(
+            title: Text("Tarea 2"),
+            subtitle: Text("Subtarea 2"),
+          ),
+        ],
+      ),
+    );
+  }
+}
+
+Color _calcularColorPorcentaje(String avance) {
+  final porcentaje = double.parse(avance);
+  if (porcentaje > 66) return Colors.green;
+  if (porcentaje > 33) return Colors.orange;
+  return Colors.red;
 }

+ 1 - 1
lib/widgets/app_dropdown.dart

@@ -74,7 +74,7 @@ class AppDropdown extends StatelessWidget {
             labelStyle: TextStyle(color: Colors.grey, fontSize: fontSize),
             focusedBorder: OutlineInputBorder(
               borderRadius: BorderRadius.circular(15),
-              borderSide: BorderSide(color: AppTheme.tertiary),
+              borderSide: BorderSide(color: AppTheme.primary),
             ),
             enabledBorder: OutlineInputBorder(
               borderRadius: BorderRadius.circular(15),

+ 1 - 1
lib/widgets/app_dropdown_modelo.dart

@@ -65,7 +65,7 @@ class AppDropdownModel<T> extends StatelessWidget {
               labelStyle: TextStyle(color: Colors.grey, fontSize: fontSize),
               focusedBorder: OutlineInputBorder(
                 borderRadius: BorderRadius.circular(15),
-                borderSide: BorderSide(color: AppTheme.tertiary),
+                borderSide: BorderSide(color: AppTheme.primary),
               ),
               enabledBorder: OutlineInputBorder(
                 borderRadius: BorderRadius.circular(15),

+ 5 - 5
lib/widgets/app_textfield.dart

@@ -104,7 +104,7 @@ class AppTextField extends StatelessWidget {
           readOnly: readOnly,
           keyboardType: keyboardType,
           textCapitalization: textCapitalization,
-          cursorColor: AppTheme.tertiary,
+          cursorColor: AppTheme.primary,
           obscureText: obscureText,
           autocorrect: true,
           onChanged: onChanged,
@@ -115,7 +115,7 @@ class AppTextField extends StatelessWidget {
             focusedBorder: OutlineInputBorder(
               borderRadius: BorderRadius.circular(10),
               borderSide: BorderSide(
-                color: AppTheme.tertiary,
+                color: AppTheme.primary,
               ),
             ),
             enabledBorder: OutlineInputBorder(
@@ -146,15 +146,15 @@ class AppTextField extends StatelessWidget {
             labelText: labelText,
             hintText: hintText,
             floatingLabelStyle: TextStyle(
-              color: AppTheme.tertiary,
+              color: AppTheme.primary,
               fontSize: fontSize,
             ),
             filled: true,
             fillColor: fillColor,
             prefixIcon: prefixIcon,
-            prefixIconColor: AppTheme.tertiary,
+            prefixIconColor: AppTheme.primary,
             suffixIcon: suffixIcon,
-            suffixIconColor: AppTheme.tertiary,
+            suffixIconColor: AppTheme.primary,
             border: OutlineInputBorder(
               borderRadius: BorderRadius.circular(15),
               borderSide: BorderSide.none,

+ 1 - 1
lib/widgets/app_textfield_n.dart

@@ -84,7 +84,7 @@ class Campo extends StatelessWidget {
           readOnly: readOnly,
           //keyboardType: keyboardType,
           textCapitalization: textCapitalization,
-          cursorColor: AppTheme.tertiary,
+          cursorColor: AppTheme.primary,
           obscureText: obscureText,
           autocorrect: true,
           onChanged: onChanged,

+ 2 - 2
lib/widgets/widgets_components.dart

@@ -56,7 +56,7 @@ encabezado(
           : Text(titulo.toString(), style: estilo),
       actions: [
         ...acciones,
-        Image.asset("assets/logo.png", width: 100),
+        // Image.asset("assets/logo.png", width: 100),
       ],
       bottom: bottom);
 }
@@ -122,7 +122,7 @@ class CargandoBarra extends StatelessWidget {
 
   @override
   Widget build(BuildContext context) {
-    return Center(
+    return const Center(
       child: Column(mainAxisAlignment: MainAxisAlignment.center, children: [
         const SizedBox(height: 8),
         LinearProgressIndicator(

+ 4 - 0
linux/flutter/generated_plugin_registrant.cc

@@ -6,9 +6,13 @@
 
 #include "generated_plugin_registrant.h"
 
+#include <open_file_linux/open_file_linux_plugin.h>
 #include <url_launcher_linux/url_launcher_plugin.h>
 
 void fl_register_plugins(FlPluginRegistry* registry) {
+  g_autoptr(FlPluginRegistrar) open_file_linux_registrar =
+      fl_plugin_registry_get_registrar_for_plugin(registry, "OpenFileLinuxPlugin");
+  open_file_linux_plugin_register_with_registrar(open_file_linux_registrar);
   g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar =
       fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin");
   url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar);

+ 1 - 0
linux/flutter/generated_plugins.cmake

@@ -3,6 +3,7 @@
 #
 
 list(APPEND FLUTTER_PLUGIN_LIST
+  open_file_linux
   url_launcher_linux
 )
 

+ 1 - 0
macos/Flutter/Flutter-Debug.xcconfig

@@ -1 +1,2 @@
+#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
 #include "ephemeral/Flutter-Generated.xcconfig"

+ 1 - 0
macos/Flutter/Flutter-Release.xcconfig

@@ -1 +1,2 @@
+#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
 #include "ephemeral/Flutter-Generated.xcconfig"

+ 2 - 0
macos/Flutter/GeneratedPluginRegistrant.swift

@@ -8,6 +8,7 @@ import Foundation
 import assets_audio_player
 import assets_audio_player_web
 import mobile_scanner
+import open_file_mac
 import path_provider_foundation
 import shared_preferences_foundation
 import url_launcher_macos
@@ -16,6 +17,7 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
   AssetsAudioPlayerPlugin.register(with: registry.registrar(forPlugin: "AssetsAudioPlayerPlugin"))
   AssetsAudioPlayerWebPlugin.register(with: registry.registrar(forPlugin: "AssetsAudioPlayerWebPlugin"))
   MobileScannerPlugin.register(with: registry.registrar(forPlugin: "MobileScannerPlugin"))
+  OpenFilePlugin.register(with: registry.registrar(forPlugin: "OpenFilePlugin"))
   PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
   SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))
   UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin"))

+ 43 - 0
macos/Podfile

@@ -0,0 +1,43 @@
+platform :osx, '10.14'
+
+# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
+ENV['COCOAPODS_DISABLE_STATS'] = 'true'
+
+project 'Runner', {
+  'Debug' => :debug,
+  'Profile' => :release,
+  'Release' => :release,
+}
+
+def flutter_root
+  generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'ephemeral', 'Flutter-Generated.xcconfig'), __FILE__)
+  unless File.exist?(generated_xcode_build_settings_path)
+    raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure \"flutter pub get\" is executed first"
+  end
+
+  File.foreach(generated_xcode_build_settings_path) do |line|
+    matches = line.match(/FLUTTER_ROOT\=(.*)/)
+    return matches[1].strip if matches
+  end
+  raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Flutter-Generated.xcconfig, then run \"flutter pub get\""
+end
+
+require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
+
+flutter_macos_podfile_setup
+
+target 'Runner' do
+  use_frameworks!
+  use_modular_headers!
+
+  flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__))
+  target 'RunnerTests' do
+    inherit! :search_paths
+  end
+end
+
+post_install do |installer|
+  installer.pods_project.targets.each do |target|
+    flutter_additional_macos_build_settings(target)
+  end
+end

+ 167 - 79
pubspec.lock

@@ -45,26 +45,26 @@ packages:
     dependency: "direct main"
     description:
       name: camera
-      sha256: "9499cbc2e51d8eb0beadc158b288380037618ce4e30c9acbc4fae1ac3ecb5797"
+      sha256: dfa8fc5a1adaeb95e7a54d86a5bd56f4bb0e035515354c8ac6d262e35cec2ec8
       url: "https://pub.dev"
     source: hosted
-    version: "0.10.5+9"
+    version: "0.10.6"
   camera_android:
     dependency: transitive
     description:
       name: camera_android
-      sha256: b350ac087f111467e705b2b76cc1322f7f5bdc122aa83b4b243b0872f390d229
+      sha256: d8b17e36353cca3fd37e92f3fce28e7249730e078c72e9b43ee7c7ad2e2f7082
       url: "https://pub.dev"
     source: hosted
-    version: "0.10.9+2"
+    version: "0.10.9+16"
   camera_avfoundation:
     dependency: transitive
     description:
       name: camera_avfoundation
-      sha256: "608b56b0880722f703871329c4d7d4c2f379c8e2936940851df7fc041abc6f51"
+      sha256: "0d04cec8715b59fb6dc60eefb47e69024f51233c570e475b886dc9290568bca7"
       url: "https://pub.dev"
     source: hosted
-    version: "0.9.13+10"
+    version: "0.9.17+4"
   camera_platform_interface:
     dependency: transitive
     description:
@@ -77,10 +77,10 @@ packages:
     dependency: transitive
     description:
       name: camera_web
-      sha256: b9235ec0a2ce949daec546f1f3d86f05c3921ed31c7d9ab6b7c03214d152fc2d
+      sha256: "595f28c89d1fb62d77c73c633193755b781c6d2e0ebcd8dc25b763b514e6ba8f"
       url: "https://pub.dev"
     source: hosted
-    version: "0.3.4"
+    version: "0.3.5"
   characters:
     dependency: transitive
     description:
@@ -117,18 +117,18 @@ packages:
     dependency: transitive
     description:
       name: cross_file
-      sha256: fedaadfa3a6996f75211d835aaeb8fede285dae94262485698afd832371b9a5e
+      sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670"
       url: "https://pub.dev"
     source: hosted
-    version: "0.3.3+8"
+    version: "0.3.4+2"
   crypto:
     dependency: transitive
     description:
       name: crypto
-      sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab
+      sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855"
       url: "https://pub.dev"
     source: hosted
-    version: "3.0.3"
+    version: "3.0.6"
   csslib:
     dependency: transitive
     description:
@@ -165,10 +165,10 @@ packages:
     dependency: transitive
     description:
       name: ffi
-      sha256: "7bf0adc28a23d395f19f3f1eb21dd7cfd1dd9f8e1c50051c069122e6853bc878"
+      sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6"
       url: "https://pub.dev"
     source: hosted
-    version: "2.1.0"
+    version: "2.1.3"
   file:
     dependency: transitive
     description:
@@ -181,10 +181,10 @@ packages:
     dependency: "direct main"
     description:
       name: file_picker
-      sha256: d1d0ac3966b36dc3e66eeefb40280c17feb87fa2099c6e22e6a1fc959327bd03
+      sha256: aac85f20436608e01a6ffd1fdd4e746a7f33c93a2c83752e626bdfaea139b877
       url: "https://pub.dev"
     source: hosted
-    version: "8.0.0+1"
+    version: "8.1.3"
   flutter:
     dependency: "direct main"
     description: flutter
@@ -210,10 +210,10 @@ packages:
     dependency: transitive
     description:
       name: flutter_plugin_android_lifecycle
-      sha256: "8cf40eebf5dec866a6d1956ad7b4f7016e6c0cc69847ab946833b7d43743809f"
+      sha256: "9b78450b89f059e96c9ebb355fa6b3df1d6b330436e0b885fb49594c41721398"
       url: "https://pub.dev"
     source: hosted
-    version: "2.0.19"
+    version: "2.0.23"
   flutter_sound:
     dependency: "direct main"
     description:
@@ -260,10 +260,10 @@ packages:
     dependency: "direct main"
     description:
       name: http
-      sha256: a2bbf9d017fcced29139daa8ed2bba4ece450ab222871df93ca9eec6f80c34ba
+      sha256: b9c29a161230ee03d3ccf545097fccd9b87a5264228c5d348202e0f0c28f9010
       url: "https://pub.dev"
     source: hosted
-    version: "1.2.0"
+    version: "1.2.2"
   http_parser:
     dependency: transitive
     description:
@@ -296,6 +296,30 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "0.6.7"
+  leak_tracker:
+    dependency: transitive
+    description:
+      name: leak_tracker
+      sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05"
+      url: "https://pub.dev"
+    source: hosted
+    version: "10.0.5"
+  leak_tracker_flutter_testing:
+    dependency: transitive
+    description:
+      name: leak_tracker_flutter_testing
+      sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806"
+      url: "https://pub.dev"
+    source: hosted
+    version: "3.0.5"
+  leak_tracker_testing:
+    dependency: transitive
+    description:
+      name: leak_tracker_testing
+      sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3"
+      url: "https://pub.dev"
+    source: hosted
+    version: "3.0.1"
   lints:
     dependency: transitive
     description:
@@ -316,26 +340,26 @@ packages:
     dependency: transitive
     description:
       name: matcher
-      sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e"
+      sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb
       url: "https://pub.dev"
     source: hosted
-    version: "0.12.16"
+    version: "0.12.16+1"
   material_color_utilities:
     dependency: transitive
     description:
       name: material_color_utilities
-      sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41"
+      sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec
       url: "https://pub.dev"
     source: hosted
-    version: "0.5.0"
+    version: "0.11.1"
   meta:
     dependency: transitive
     description:
       name: meta
-      sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e
+      sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7
       url: "https://pub.dev"
     source: hosted
-    version: "1.10.0"
+    version: "1.15.0"
   mobile_scanner:
     dependency: "direct main"
     description:
@@ -364,42 +388,98 @@ packages:
     dependency: "direct main"
     description:
       name: open_file
-      sha256: a5a32d44acb7c899987d0999e1e3cbb0a0f1adebbf41ac813ec6d2d8faa0af20
+      sha256: "737641e823d568a12b63494855010ceef286bcdf8f88d0a831e53229a5e850e8"
+      url: "https://pub.dev"
+    source: hosted
+    version: "3.5.9"
+  open_file_android:
+    dependency: transitive
+    description:
+      name: open_file_android
+      sha256: "58141fcaece2f453a9684509a7275f231ac0e3d6ceb9a5e6de310a7dff9084aa"
       url: "https://pub.dev"
     source: hosted
-    version: "3.3.2"
+    version: "1.0.6"
+  open_file_ios:
+    dependency: transitive
+    description:
+      name: open_file_ios
+      sha256: "02996f01e5f6863832068e97f8f3a5ef9b613516db6897f373b43b79849e4d07"
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.0.3"
+  open_file_linux:
+    dependency: transitive
+    description:
+      name: open_file_linux
+      sha256: d189f799eecbb139c97f8bc7d303f9e720954fa4e0fa1b0b7294767e5f2d7550
+      url: "https://pub.dev"
+    source: hosted
+    version: "0.0.5"
+  open_file_mac:
+    dependency: transitive
+    description:
+      name: open_file_mac
+      sha256: dd1570bd12601b4d50fda3609c1662382f17ee403b47f0d74d737de603a39ec6
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.0.2"
+  open_file_platform_interface:
+    dependency: transitive
+    description:
+      name: open_file_platform_interface
+      sha256: "101b424ca359632699a7e1213e83d025722ab668b9fd1412338221bf9b0e5757"
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.0.3"
+  open_file_web:
+    dependency: transitive
+    description:
+      name: open_file_web
+      sha256: e3dbc9584856283dcb30aef5720558b90f88036360bd078e494ab80a80130c4f
+      url: "https://pub.dev"
+    source: hosted
+    version: "0.0.4"
+  open_file_windows:
+    dependency: transitive
+    description:
+      name: open_file_windows
+      sha256: d26c31ddf935a94a1a3aa43a23f4fff8a5ff4eea395fe7a8cb819cf55431c875
+      url: "https://pub.dev"
+    source: hosted
+    version: "0.0.3"
   path:
     dependency: transitive
     description:
       name: path
-      sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917"
+      sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af"
       url: "https://pub.dev"
     source: hosted
-    version: "1.8.3"
+    version: "1.9.0"
   path_provider:
     dependency: transitive
     description:
       name: path_provider
-      sha256: fec0d61223fba3154d87759e3cc27fe2c8dc498f6386c6d6fc80d1afdd1bf378
+      sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd"
       url: "https://pub.dev"
     source: hosted
-    version: "2.1.4"
+    version: "2.1.5"
   path_provider_android:
     dependency: transitive
     description:
       name: path_provider_android
-      sha256: a248d8146ee5983446bf03ed5ea8f6533129a12b11f12057ad1b4a67a2b3b41d
+      sha256: c464428172cb986b758c6d1724c603097febb8fb855aa265aeecc9280c294d4a
       url: "https://pub.dev"
     source: hosted
-    version: "2.2.4"
+    version: "2.2.12"
   path_provider_foundation:
     dependency: transitive
     description:
       name: path_provider_foundation
-      sha256: "5a7999be66e000916500be4f15a3633ebceb8302719b47b9cc49ce924125350f"
+      sha256: f234384a3fdd67f989b4d54a5d73ca2a6c422fa55ae694381ae0f4375cd1ea16
       url: "https://pub.dev"
     source: hosted
-    version: "2.3.2"
+    version: "2.4.0"
   path_provider_linux:
     dependency: transitive
     description:
@@ -452,10 +532,10 @@ packages:
     dependency: transitive
     description:
       name: permission_handler_html
-      sha256: "54bf176b90f6eddd4ece307e2c06cf977fb3973719c35a93b85cc7093eb6070d"
+      sha256: af26edbbb1f2674af65a8f4b56e1a6f526156bc273d0e65dd8075fab51c78851
       url: "https://pub.dev"
     source: hosted
-    version: "0.1.1"
+    version: "0.1.3+2"
   permission_handler_platform_interface:
     dependency: transitive
     description:
@@ -497,7 +577,7 @@ packages:
     source: hosted
     version: "2.1.8"
   provider:
-    dependency: transitive
+    dependency: "direct main"
     description:
       name: provider
       sha256: c8a055ee5ce3fd98d6fc872478b03823ffdb448699c6ebdbbc71d59b596fd48c
@@ -524,34 +604,34 @@ packages:
     dependency: "direct main"
     description:
       name: shared_preferences
-      sha256: d3bbe5553a986e83980916ded2f0b435ef2e1893dfaa29d5a7a790d0eca12180
+      sha256: "746e5369a43170c25816cc472ee016d3a66bc13fcf430c0bc41ad7b4b2922051"
       url: "https://pub.dev"
     source: hosted
-    version: "2.2.3"
+    version: "2.3.2"
   shared_preferences_android:
     dependency: transitive
     description:
       name: shared_preferences_android
-      sha256: "1ee8bf911094a1b592de7ab29add6f826a7331fb854273d55918693d5364a1f2"
+      sha256: "3b9febd815c9ca29c9e3520d50ec32f49157711e143b7a4ca039eb87e8ade5ab"
       url: "https://pub.dev"
     source: hosted
-    version: "2.2.2"
+    version: "2.3.3"
   shared_preferences_foundation:
     dependency: transitive
     description:
       name: shared_preferences_foundation
-      sha256: "7708d83064f38060c7b39db12aefe449cb8cdc031d6062280087bc4cdb988f5c"
+      sha256: "07e050c7cd39bad516f8d64c455f04508d09df104be326d8c02551590a0d513d"
       url: "https://pub.dev"
     source: hosted
-    version: "2.3.5"
+    version: "2.5.3"
   shared_preferences_linux:
     dependency: transitive
     description:
       name: shared_preferences_linux
-      sha256: "2ba0510d3017f91655b7543e9ee46d48619de2a2af38e5c790423f7007c7ccc1"
+      sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f"
       url: "https://pub.dev"
     source: hosted
-    version: "2.4.0"
+    version: "2.4.1"
   shared_preferences_platform_interface:
     dependency: transitive
     description:
@@ -564,18 +644,18 @@ packages:
     dependency: transitive
     description:
       name: shared_preferences_web
-      sha256: "7b15ffb9387ea3e237bb7a66b8a23d2147663d391cafc5c8f37b2e7b4bde5d21"
+      sha256: d2ca4132d3946fec2184261726b355836a82c33d7d5b67af32692aff18a4684e
       url: "https://pub.dev"
     source: hosted
-    version: "2.2.2"
+    version: "2.4.2"
   shared_preferences_windows:
     dependency: transitive
     description:
       name: shared_preferences_windows
-      sha256: "398084b47b7f92110683cac45c6dc4aae853db47e470e5ddcd52cab7f7196ab2"
+      sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1"
       url: "https://pub.dev"
     source: hosted
-    version: "2.4.0"
+    version: "2.4.1"
   sky_engine:
     dependency: transitive
     description: flutter
@@ -625,10 +705,10 @@ packages:
     dependency: transitive
     description:
       name: synchronized
-      sha256: "539ef412b170d65ecdafd780f924e5be3f60032a1128df156adad6c5b373d558"
+      sha256: "69fe30f3a8b04a0be0c15ae6490fc859a78ef4c43ae2dd5e8a623d45bfcf9225"
       url: "https://pub.dev"
     source: hosted
-    version: "3.1.0+1"
+    version: "3.3.0+3"
   term_glyph:
     dependency: transitive
     description:
@@ -641,10 +721,10 @@ packages:
     dependency: transitive
     description:
       name: test_api
-      sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b"
+      sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb"
       url: "https://pub.dev"
     source: hosted
-    version: "0.6.1"
+    version: "0.7.2"
   timezone:
     dependency: "direct main"
     description:
@@ -657,10 +737,10 @@ packages:
     dependency: transitive
     description:
       name: typed_data
-      sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c
+      sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006
       url: "https://pub.dev"
     source: hosted
-    version: "1.3.2"
+    version: "1.4.0"
   universal_html:
     dependency: "direct main"
     description:
@@ -681,42 +761,42 @@ packages:
     dependency: "direct main"
     description:
       name: url_launcher
-      sha256: "21b704ce5fa560ea9f3b525b43601c678728ba46725bab9b01187b4831377ed3"
+      sha256: "9d06212b1362abc2f0f0d78e6f09f726608c74e3b9462e8368bb03314aa8d603"
       url: "https://pub.dev"
     source: hosted
-    version: "6.3.0"
+    version: "6.3.1"
   url_launcher_android:
     dependency: transitive
     description:
       name: url_launcher_android
-      sha256: "17cd5e205ea615e2c6ea7a77323a11712dffa0720a8a90540db57a01347f9ad9"
+      sha256: "0dea215895a4d254401730ca0ba8204b29109a34a99fb06ae559a2b60988d2de"
       url: "https://pub.dev"
     source: hosted
-    version: "6.3.2"
+    version: "6.3.13"
   url_launcher_ios:
     dependency: transitive
     description:
       name: url_launcher_ios
-      sha256: "75bb6fe3f60070407704282a2d295630cab232991eb52542b18347a8a941df03"
+      sha256: e43b677296fadce447e987a2f519dcf5f6d1e527dc35d01ffab4fff5b8a7063e
       url: "https://pub.dev"
     source: hosted
-    version: "6.2.4"
+    version: "6.3.1"
   url_launcher_linux:
     dependency: transitive
     description:
       name: url_launcher_linux
-      sha256: ab360eb661f8879369acac07b6bb3ff09d9471155357da8443fd5d3cf7363811
+      sha256: e2b9622b4007f97f504cd64c0128309dfb978ae66adbe944125ed9e1750f06af
       url: "https://pub.dev"
     source: hosted
-    version: "3.1.1"
+    version: "3.2.0"
   url_launcher_macos:
     dependency: transitive
     description:
       name: url_launcher_macos
-      sha256: "9a1a42d5d2d95400c795b2914c36fdcb525870c752569438e4ebb09a2b5d90de"
+      sha256: "769549c999acdb42b8bcfa7c43d72bf79a382ca7441ab18a808e101149daf672"
       url: "https://pub.dev"
     source: hosted
-    version: "3.2.0"
+    version: "3.2.1"
   url_launcher_platform_interface:
     dependency: transitive
     description:
@@ -729,18 +809,18 @@ packages:
     dependency: transitive
     description:
       name: url_launcher_web
-      sha256: fff0932192afeedf63cdd50ecbb1bc825d31aed259f02bb8dba0f3b729a5e88b
+      sha256: "772638d3b34c779ede05ba3d38af34657a05ac55b06279ea6edd409e323dca8e"
       url: "https://pub.dev"
     source: hosted
-    version: "2.2.3"
+    version: "2.3.3"
   url_launcher_windows:
     dependency: transitive
     description:
       name: url_launcher_windows
-      sha256: "49c10f879746271804767cb45551ec5592cdab00ee105c06dddde1a98f73b185"
+      sha256: "44cf3aabcedde30f2dba119a9dea3b0f2672fbe6fa96e85536251d678216b3c4"
       url: "https://pub.dev"
     source: hosted
-    version: "3.1.2"
+    version: "3.1.3"
   uuid:
     dependency: transitive
     description:
@@ -757,30 +837,38 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "2.1.4"
+  vm_service:
+    dependency: transitive
+    description:
+      name: vm_service
+      sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d"
+      url: "https://pub.dev"
+    source: hosted
+    version: "14.2.5"
   web:
     dependency: transitive
     description:
       name: web
-      sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152
+      sha256: cd3543bd5798f6ad290ea73d210f423502e71900302dde696f8bff84bf89a1cb
       url: "https://pub.dev"
     source: hosted
-    version: "0.3.0"
+    version: "1.1.0"
   win32:
     dependency: transitive
     description:
       name: win32
-      sha256: "464f5674532865248444b4c3daca12bd9bf2d7c47f759ce2617986e7229494a8"
+      sha256: "10169d3934549017f0ae278ccb07f828f9d6ea21573bab0fb77b0e1ef0fce454"
       url: "https://pub.dev"
     source: hosted
-    version: "5.2.0"
+    version: "5.7.2"
   xdg_directories:
     dependency: transitive
     description:
       name: xdg_directories
-      sha256: faea9dee56b520b55a566385b84f2e8de55e7496104adada9962e0bd11bcff1d
+      sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15"
       url: "https://pub.dev"
     source: hosted
-    version: "1.0.4"
+    version: "1.1.0"
   xml:
     dependency: transitive
     description:
@@ -790,5 +878,5 @@ packages:
     source: hosted
     version: "6.5.0"
 sdks:
-  dart: ">=3.2.3 <4.0.0"
-  flutter: ">=3.16.0"
+  dart: ">=3.5.0 <4.0.0"
+  flutter: ">=3.24.0"

+ 2 - 0
pubspec.yaml

@@ -15,6 +15,7 @@ dependencies:
   flutter:
     sdk: flutter
   flutter_pdfview: ^1.3.4
+
   flutter_sound: ^9.2.13
   http: ^1.2.0
   image: ^4.3.0
@@ -23,6 +24,7 @@ dependencies:
   omni_datetime_picker: ^1.1.0
   open_file: ^3.3.2
   permission_handler: ^11.3.1
+  provider: ^6.1.2
   shared_preferences: ^2.2.3
   timezone: ^0.9.4
   universal_html: ^2.2.4