From 8a56754baf4bb385a24378d6941c2ca47f259c7e Mon Sep 17 00:00:00 2001 From: Gaurav60419430 Date: Wed, 29 Jan 2025 03:56:33 +0530 Subject: [PATCH] #7 Add Dark Mode Support to Firebase Editor App --- android/app/google-services.json | 24 ++++--- firebase.json | 2 +- lib/firebase_options.dart | 70 ------------------- lib/main.dart | 111 +++++++++++++++++------------- lib/utils/theme_provider.dart | 59 ++++++++++++++++ lib/views/home/home_screen.dart | 88 ++++++++++++++--------- lib/widgets/firebase_options.dart | 93 +++++++++++++++++++++++++ pubspec.lock | 16 +++++ pubspec.yaml | 2 +- 9 files changed, 303 insertions(+), 162 deletions(-) delete mode 100644 lib/firebase_options.dart create mode 100644 lib/utils/theme_provider.dart create mode 100644 lib/widgets/firebase_options.dart diff --git a/android/app/google-services.json b/android/app/google-services.json index a2214ad..f09576e 100644 --- a/android/app/google-services.json +++ b/android/app/google-services.json @@ -1,37 +1,45 @@ { "project_info": { - "project_number": "211384953661", - "project_id": "gsoc-24-3f4d1", - "storage_bucket": "gsoc-24-3f4d1.appspot.com" + "project_number": "124506192389", + "project_id": "arya-30631", + "storage_bucket": "arya-30631.firebasestorage.app" }, "client": [ { "client_info": { - "mobilesdk_app_id": "1:211384953661:android:14233d29467afa30317354", + "mobilesdk_app_id": "1:124506192389:android:3b5d15df5a5c4ce2c33a6c", "android_client_info": { "package_name": "com.example.firebase_editor_gsoc" } }, "oauth_client": [ { - "client_id": "211384953661-sac152s9j9uif0asf1772jkc9nr5le8t.apps.googleusercontent.com", + "client_id": "124506192389-u63mabk5mu5j8uiecnfk5rmpq874orsk.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.example.firebase_editor_gsoc", + "certificate_hash": "ef9611c769de4c139ac9d28b61f2f9fbcb80acb0" + } + }, + { + "client_id": "124506192389-d33edk5jiu8len9u7dgptfon6gc64tdb.apps.googleusercontent.com", "client_type": 3 } ], "api_key": [ { - "current_key": "AIzaSyAO1F8fTW1EG88fnnTTFRJiKXH4I-MHlbI" + "current_key": "AIzaSyCUpHP6uGWzHKCtu5_vPmI1vcI7ph_Ihvk" } ], "services": { "appinvite_service": { "other_platform_oauth_client": [ { - "client_id": "211384953661-sac152s9j9uif0asf1772jkc9nr5le8t.apps.googleusercontent.com", + "client_id": "124506192389-d33edk5jiu8len9u7dgptfon6gc64tdb.apps.googleusercontent.com", "client_type": 3 }, { - "client_id": "211384953661-9hkosute6of7qapl18kjacl04m6f14ko.apps.googleusercontent.com", + "client_id": "124506192389-32s8la4ndjd5q30phqj8cnsbrht2gp67.apps.googleusercontent.com", "client_type": 2, "ios_info": { "bundle_id": "com.example.firebaseEditorGsoc" diff --git a/firebase.json b/firebase.json index 40a15b7..e76e02a 100644 --- a/firebase.json +++ b/firebase.json @@ -1 +1 @@ -{"flutter":{"platforms":{"android":{"default":{"projectId":"gsoc-24-3f4d1","appId":"1:211384953661:android:14233d29467afa30317354","fileOutput":"android/app/google-services.json"}},"dart":{"lib/firebase_options.dart":{"projectId":"gsoc-24-3f4d1","configurations":{"android":"1:211384953661:android:14233d29467afa30317354","ios":"1:211384953661:ios:007f4e6da5f618ea317354"}}}}}} \ No newline at end of file +{"flutter":{"platforms":{"android":{"default":{"projectId":"arya-30631","appId":"1:124506192389:android:3b5d15df5a5c4ce2c33a6c","fileOutput":"android/app/google-services.json"}},"dart":{"lib/firebase_options.dart":{"projectId":"arya-30631","configurations":{"android":"1:124506192389:android:3b5d15df5a5c4ce2c33a6c","ios":"1:124506192389:ios:41bf9826de2537b9c33a6c","macos":"1:124506192389:ios:41bf9826de2537b9c33a6c","web":"1:124506192389:web:7fcd937cc1553229c33a6c","windows":"1:124506192389:web:17314a34483c0f39c33a6c"}}}}}} \ No newline at end of file diff --git a/lib/firebase_options.dart b/lib/firebase_options.dart deleted file mode 100644 index f56211b..0000000 --- a/lib/firebase_options.dart +++ /dev/null @@ -1,70 +0,0 @@ -// File generated by FlutterFire CLI. -// ignore_for_file: type=lint -import 'package:firebase_core/firebase_core.dart' show FirebaseOptions; -import 'package:flutter/foundation.dart' - show defaultTargetPlatform, kIsWeb, TargetPlatform; - -/// Default [FirebaseOptions] for use with your Firebase apps. -/// -/// Example: -/// ```dart -/// import 'firebase_options.dart'; -/// // ... -/// await Firebase.initializeApp( -/// options: DefaultFirebaseOptions.currentPlatform, -/// ); -/// ``` -class DefaultFirebaseOptions { - static FirebaseOptions get currentPlatform { - if (kIsWeb) { - throw UnsupportedError( - 'DefaultFirebaseOptions have not been configured for web - ' - 'you can reconfigure this by running the FlutterFire CLI again.', - ); - } - switch (defaultTargetPlatform) { - case TargetPlatform.android: - return android; - case TargetPlatform.iOS: - return ios; - case TargetPlatform.macOS: - throw UnsupportedError( - 'DefaultFirebaseOptions have not been configured for macos - ' - 'you can reconfigure this by running the FlutterFire CLI again.', - ); - case TargetPlatform.windows: - throw UnsupportedError( - 'DefaultFirebaseOptions have not been configured for windows - ' - 'you can reconfigure this by running the FlutterFire CLI again.', - ); - case TargetPlatform.linux: - throw UnsupportedError( - 'DefaultFirebaseOptions have not been configured for linux - ' - 'you can reconfigure this by running the FlutterFire CLI again.', - ); - default: - throw UnsupportedError( - 'DefaultFirebaseOptions are not supported for this platform.', - ); - } - } - - static const FirebaseOptions android = FirebaseOptions( - apiKey: 'AIzaSyAO1F8fTW1EG88fnnTTFRJiKXH4I-MHlbI', - appId: '1:211384953661:android:14233d29467afa30317354', - messagingSenderId: '211384953661', - projectId: 'gsoc-24-3f4d1', - storageBucket: 'gsoc-24-3f4d1.appspot.com', - ); - - static const FirebaseOptions ios = FirebaseOptions( - apiKey: 'AIzaSyAfe7Be2vESlx3uSGQs_zZ12QWN-EdBgGs', - appId: '1:211384953661:ios:007f4e6da5f618ea317354', - messagingSenderId: '211384953661', - projectId: 'gsoc-24-3f4d1', - storageBucket: 'gsoc-24-3f4d1.appspot.com', - iosClientId: '211384953661-9hkosute6of7qapl18kjacl04m6f14ko.apps.googleusercontent.com', - iosBundleId: 'com.example.firebaseEditorGsoc', - ); - -} \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart index b2e13eb..1aa18c7 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -2,13 +2,16 @@ import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_editor_gsoc/controllers/access_controller.dart'; import 'package:firebase_editor_gsoc/controllers/token_controller.dart'; import 'package:firebase_editor_gsoc/controllers/user_controller.dart'; -import 'package:firebase_editor_gsoc/firebase_options.dart'; +import 'package:firebase_editor_gsoc/widgets/firebase_options.dart'; import 'package:firebase_editor_gsoc/views/user_sign_in/user_login.dart'; import 'package:firebase_editor_gsoc/views/screens/starter_screens/starter_screen_1.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:shared_preferences/shared_preferences.dart'; +import 'package:provider/provider.dart'; +import 'package:firebase_editor_gsoc/utils/theme_provider.dart'; +import 'package:firebase_editor_gsoc/views/home/home_screen.dart'; // navigator key for navigation purposes // This key is crucial for navigating without direct access to BuildContext. @@ -17,8 +20,7 @@ final navigatorKey = GlobalKey(); /// for handling notifications when app is in terminated state /// must be a top level function /// to make a pop up,, give android channel id in additional setting in firebase - -// @pragma('vm:entry-point') +@pragma('vm:entry-point') Future _firebaseMessagingBackgroundHandler(RemoteMessage message) async { await Firebase.initializeApp(); } @@ -42,7 +44,12 @@ void main() async { final bool hasSeenStarterScreens = prefs.getBool('hasSeenStarterScreens') ?? false; - runApp(MyApp(hasSeenStarterScreens: hasSeenStarterScreens)); + runApp( + ChangeNotifierProvider( + create: (_) => ThemeProvider(), + child: MyApp(hasSeenStarterScreens: hasSeenStarterScreens), + ), + ); } class MyApp extends StatelessWidget { @@ -50,57 +57,63 @@ class MyApp extends StatelessWidget { const MyApp({super.key, required this.hasSeenStarterScreens}); - // This widget is the root of your application. @override Widget build(BuildContext context) { + final themeProvider = Provider.of(context); + return GetMaterialApp( title: 'Firebase Editor', - theme: ThemeData( - colorScheme: ColorScheme.fromSeed( - seedColor: Colors.blue, - secondary: Colors.amber, // Adding a secondary color - ), - useMaterial3: true, - textTheme: const TextTheme( - displayLarge: TextStyle( - fontSize: 62.0, - fontWeight: FontWeight.bold, - color: Colors.white), - displayMedium: TextStyle( - fontSize: 42.0, - fontWeight: FontWeight.bold, - color: Colors.white), - titleLarge: - TextStyle(fontSize: 24.0, fontStyle: FontStyle.italic), - titleMedium: - TextStyle(fontSize: 26.0, fontWeight: FontWeight.bold), - bodyMedium: TextStyle(fontSize: 14.0, fontFamily: 'Hind'), - bodySmall: TextStyle( - fontSize: 18.0, - fontWeight: FontWeight.w400, - color: Colors.white)), - elevatedButtonTheme: ElevatedButtonThemeData( - style: ElevatedButton.styleFrom( - foregroundColor: Colors.black, - backgroundColor: Colors.white, // Button text color - padding: - const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8.0), - ), - ), - appBarTheme: const AppBarTheme( - backgroundColor: Colors.blue, - titleTextStyle: TextStyle( - color: Colors.white, - fontSize: 24.0, - ), - iconTheme: IconThemeData( - color: Colors.white, - ), - )), - home: - hasSeenStarterScreens ? LoginScreen() : const StarterScreen1(), + + /// Use the custom themes from ThemeProvider + theme: themeProvider.lightTheme, + darkTheme: themeProvider.darkTheme, + themeMode: themeProvider.currentTheme, // Toggles based on isDarkMode + + home: hasSeenStarterScreens ? LoginScreen() : const StarterScreen1(), navigatorKey: navigatorKey, // Assign the global navigator key debugShowCheckedModeBanner: false, ); } } + +// HomeScreen Implementation +class HomeScreen extends StatelessWidget { + const HomeScreen({super.key}); + + @override + Widget build(BuildContext context) { + final themeProvider = Provider.of(context); + + return Scaffold( + appBar: AppBar( + title: const Text('Home'), + actions: [ + IconButton( + icon: Icon( + themeProvider.isDarkMode ? Icons.light_mode : Icons.dark_mode, + ), + // Use onPrimary for icons on the appBar's primary color + color: Theme.of(context).colorScheme.onPrimary, + onPressed: () => themeProvider.toggleTheme(), + ), + ], + ), + body: const HomeContent(), + ); + } +} + +class HomeContent extends StatelessWidget { + const HomeContent({super.key}); + + @override + Widget build(BuildContext context) { + return Center( + child: Text( + 'Welcome to Home Screen', + // Use the headlineMedium from the theme + style: Theme.of(context).textTheme.headlineMedium, + ), + ); + } +} diff --git a/lib/utils/theme_provider.dart b/lib/utils/theme_provider.dart new file mode 100644 index 0000000..bad3fb3 --- /dev/null +++ b/lib/utils/theme_provider.dart @@ -0,0 +1,59 @@ +import 'package:flutter/material.dart'; + +class ThemeProvider with ChangeNotifier { + bool _isDarkMode = false; + bool get isDarkMode => _isDarkMode; + + /// Controls whether the app shows the light or dark theme + ThemeMode get currentTheme => _isDarkMode ? ThemeMode.dark : ThemeMode.light; + + /// Define your light theme + ThemeData get lightTheme => ThemeData( + brightness: Brightness.light, + // Using a color scheme, app bar theme, and text theme suitable for light mode + colorScheme: const ColorScheme.light( + primary: Colors.blue, + background: Colors.white, + onBackground: Colors.black, + ), + appBarTheme: const AppBarTheme( + backgroundColor: Colors.blue, + foregroundColor: Colors.white, + ), + textTheme: const TextTheme( + bodyMedium: TextStyle(color: Colors.black), + headlineMedium: TextStyle( + color: Colors.black87, + fontWeight: FontWeight.bold, + ), + ), + ); + + /// Define your dark theme + ThemeData get darkTheme => ThemeData( + brightness: Brightness.dark, + // Using a color scheme, app bar theme, and text theme suitable for dark mode + colorScheme: ColorScheme.dark( + primary: Colors.blueGrey, + background: Colors.grey.shade900, + onBackground: Colors.white, + ), + appBarTheme: AppBarTheme( + backgroundColor: Colors.grey.shade900, + foregroundColor: Colors.white, + ), + textTheme: const TextTheme( + bodyMedium: TextStyle(color: Colors.white), + headlineMedium: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + ), + ), + ); + + /// Toggles between light and dark + void toggleTheme() { + _isDarkMode = !_isDarkMode; + notifyListeners(); // Notifies that the theme changed + } +} diff --git a/lib/views/home/home_screen.dart b/lib/views/home/home_screen.dart index 256a82d..5c8e341 100644 --- a/lib/views/home/home_screen.dart +++ b/lib/views/home/home_screen.dart @@ -13,6 +13,9 @@ import 'package:fl_chart/fl_chart.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:intl/intl.dart'; // Import the intl package for date formatting +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:firebase_editor_gsoc/utils/theme_provider.dart'; /// The HomeScreen widget is the main screen of the application. /// It displays user information, recent entries, and a bar chart of operations analysis. @@ -93,9 +96,25 @@ class _HomeScreenState extends State { /// The build method defines the UI of the HomeScreen. @override Widget build(BuildContext context) { + // Access the ThemeProvider here: + final themeProvider = Provider.of(context); + return Scaffold( appBar: AppBar( title: const Text('Home'), + // ADDING THE DARK-MODE TOGGLE ICON BUTTON + actions: [ + IconButton( + // Switch the icon based on the current theme + icon: Icon( + themeProvider.isDarkMode ? Icons.dark_mode : Icons.light_mode, + ), + onPressed: () { + // Toggle the theme when pressed + themeProvider.toggleTheme(); + }, + ), + ], ), drawer: CustomDrawer(), // Custom navigation drawer body: SingleChildScrollView( @@ -144,9 +163,7 @@ class _HomeScreenState extends State { ), ], ), - const SizedBox( - width: 20.0, - ), + const SizedBox(width: 20.0), // User display name and email Column( mainAxisAlignment: MainAxisAlignment.center, @@ -175,9 +192,7 @@ class _HomeScreenState extends State { ], ), ), - const SizedBox( - height: 16, - ), + const SizedBox(height: 16), // Container with quick access buttons for Projects, Profile, and Help Container( decoration: BoxDecoration( @@ -236,9 +251,8 @@ class _HomeScreenState extends State { ), ), ), - const SizedBox( - height: 20.0, - ), + const SizedBox(height: 20.0), + // Bar chart displaying operations data Stack( children: [ @@ -256,24 +270,27 @@ class _HomeScreenState extends State { color: Colors.white, borderRadius: BorderRadius.circular(15.0), border: Border.all( - color: Colors.blueAccent, width: 4.0), + color: Colors.blueAccent, + width: 4.0, + ), ), child: Padding( padding: const EdgeInsets.all(8.0), child: _chartData.isEmpty ? const Center( - child: Text( - "No operations data available!", - style: TextStyle( - fontSize: 18.0, - fontWeight: FontWeight.bold, - color: Colors.grey, - ), - )) // Displayed if no chart data is available + child: Text( + "No operations data available!", + style: TextStyle( + fontSize: 18.0, + fontWeight: FontWeight.bold, + color: Colors.grey, + ), + ), + ) // Displayed if no chart data is available : BarChart( BarChartData( alignment: BarChartAlignment.spaceAround, - maxY: _getMaxY(), // Calculate the max value for the y-axis + maxY: _getMaxY(), // Calculate max for the y-axis barGroups: _chartData.entries.map((entry) { return BarChartGroupData( x: entry.key.hashCode, @@ -296,17 +313,18 @@ class _HomeScreenState extends State { fontSize: 14, fontWeight: FontWeight.bold), ), - axisNameSize: 30, // Space for the x-axis title + axisNameSize: 30, // Space for x-axis title sideTitles: SideTitles( showTitles: true, getTitlesWidget: (value, meta) { return SideTitleWidget( axisSide: meta.axisSide, child: Text( - _chartData.keys.elementAt(value.toInt() % - _chartData.length), + _chartData.keys.elementAt( + value.toInt() % _chartData.length), style: const TextStyle( - fontSize: 10), + fontSize: 10, + ), ), ); }, @@ -314,12 +332,12 @@ class _HomeScreenState extends State { ), leftTitles: AxisTitles( axisNameWidget: const Text( - 'Operations Count', // Title for the y-axis + 'Operations Count', // Title for y-axis style: TextStyle( fontSize: 14, fontWeight: FontWeight.bold), ), - axisNameSize: 30, // Space for the y-axis title + axisNameSize: 30, // Space for y-axis title sideTitles: SideTitles( showTitles: true, reservedSize: 40, @@ -329,7 +347,8 @@ class _HomeScreenState extends State { child: Text( value.toInt().toString(), style: const TextStyle( - fontSize: 10), + fontSize: 10, + ), ), ); }, @@ -346,8 +365,9 @@ class _HomeScreenState extends State { borderData: FlBorderData( show: true, border: Border.all( - color: const Color(0xff37434d), - width: 1), + color: Color(0xff37434d), + width: 1, + ), ), ), ), @@ -358,9 +378,8 @@ class _HomeScreenState extends State { ), ], ), - const SizedBox( - height: 20.0, - ), + const SizedBox(height: 20.0), + // Container displaying the Recently Accessed header Container( decoration: BoxDecoration( @@ -400,7 +419,8 @@ class _HomeScreenState extends State { children: [ _buildTextTile( title: entry['projectName'] ?? 'Unknown Project', - subtitle: 'Database: ${entry['databaseName'] ?? 'Unknown'}\n' + subtitle: + 'Database: ${entry['databaseName'] ?? 'Unknown'}\n' 'Collection: ${entry['collectionName'] ?? 'Unknown'}\n' 'Update Time: ${formatDateTime(entry['updateTime'])}', ), @@ -449,9 +469,10 @@ class _HomeScreenState extends State { ), ), const SizedBox(height: 8), // Space between icon and text + // Use bodyMedium from the theme for the label text Text( label, - style: const TextStyle(fontSize: 14, color: Colors.black), + style: Theme.of(context).textTheme.bodyMedium?.copyWith(fontSize: 14), ), ], ), @@ -488,6 +509,7 @@ class _HomeScreenState extends State { style: const TextStyle( fontSize: 16, fontWeight: FontWeight.bold, + // If you prefer dynamic color, remove the color or apply theme here ), ), const SizedBox(height: 8), // Space between title and subtitle diff --git a/lib/widgets/firebase_options.dart b/lib/widgets/firebase_options.dart new file mode 100644 index 0000000..c96b1e1 --- /dev/null +++ b/lib/widgets/firebase_options.dart @@ -0,0 +1,93 @@ +// File generated by FlutterFire CLI. +// ignore_for_file: type=lint +import 'package:firebase_core/firebase_core.dart' show FirebaseOptions; +import 'package:flutter/foundation.dart' + show defaultTargetPlatform, kIsWeb, TargetPlatform; + +/// Default [FirebaseOptions] for use with your Firebase apps. +/// +/// Example: +/// ```dart +/// import 'firebase_options.dart'; +/// // ... +/// await Firebase.initializeApp( +/// options: DefaultFirebaseOptions.currentPlatform, +/// ); +/// ``` +class DefaultFirebaseOptions { + static FirebaseOptions get currentPlatform { + if (kIsWeb) { + return web; + } + switch (defaultTargetPlatform) { + case TargetPlatform.android: + return android; + case TargetPlatform.iOS: + return ios; + case TargetPlatform.macOS: + return macos; + case TargetPlatform.windows: + return windows; + case TargetPlatform.linux: + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for linux - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + default: + throw UnsupportedError( + 'DefaultFirebaseOptions are not supported for this platform.', + ); + } + } + + static const FirebaseOptions android = FirebaseOptions( + apiKey: 'AIzaSyCUpHP6uGWzHKCtu5_vPmI1vcI7ph_Ihvk', + appId: '1:124506192389:android:3b5d15df5a5c4ce2c33a6c', + messagingSenderId: '124506192389', + projectId: 'arya-30631', + storageBucket: 'arya-30631.firebasestorage.app', + ); + + static const FirebaseOptions ios = FirebaseOptions( + apiKey: 'AIzaSyAUVLB1ZeR68U_FE4ib2dWuOBp2bYY-1y4', + appId: '1:124506192389:ios:41bf9826de2537b9c33a6c', + messagingSenderId: '124506192389', + projectId: 'arya-30631', + storageBucket: 'arya-30631.firebasestorage.app', + androidClientId: '124506192389-u63mabk5mu5j8uiecnfk5rmpq874orsk.apps.googleusercontent.com', + iosClientId: '124506192389-32s8la4ndjd5q30phqj8cnsbrht2gp67.apps.googleusercontent.com', + iosBundleId: 'com.example.firebaseEditorGsoc', + ); + + static const FirebaseOptions web = FirebaseOptions( + apiKey: 'AIzaSyC3yqOrBPY8zgkyxgX3fpaYrgxjnAyFWZQ', + appId: '1:124506192389:web:7fcd937cc1553229c33a6c', + messagingSenderId: '124506192389', + projectId: 'arya-30631', + authDomain: 'arya-30631.firebaseapp.com', + storageBucket: 'arya-30631.firebasestorage.app', + measurementId: 'G-QP8SDRD4SX', + ); + + static const FirebaseOptions macos = FirebaseOptions( + apiKey: 'AIzaSyAUVLB1ZeR68U_FE4ib2dWuOBp2bYY-1y4', + appId: '1:124506192389:ios:41bf9826de2537b9c33a6c', + messagingSenderId: '124506192389', + projectId: 'arya-30631', + storageBucket: 'arya-30631.firebasestorage.app', + androidClientId: '124506192389-u63mabk5mu5j8uiecnfk5rmpq874orsk.apps.googleusercontent.com', + iosClientId: '124506192389-32s8la4ndjd5q30phqj8cnsbrht2gp67.apps.googleusercontent.com', + iosBundleId: 'com.example.firebaseEditorGsoc', + ); + + static const FirebaseOptions windows = FirebaseOptions( + apiKey: 'AIzaSyC3yqOrBPY8zgkyxgX3fpaYrgxjnAyFWZQ', + appId: '1:124506192389:web:17314a34483c0f39c33a6c', + messagingSenderId: '124506192389', + projectId: 'arya-30631', + authDomain: 'arya-30631.firebaseapp.com', + storageBucket: 'arya-30631.firebasestorage.app', + measurementId: 'G-FQQFFLYV0V', + ); + +} \ No newline at end of file diff --git a/pubspec.lock b/pubspec.lock index 53ad741..ad30d10 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -768,6 +768,14 @@ packages: url: "https://pub.dev" source: hosted version: "4.2.0" + nested: + dependency: transitive + description: + name: nested + sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" + url: "https://pub.dev" + source: hosted + version: "1.0.0" package_config: dependency: transitive description: @@ -920,6 +928,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.5.1" + provider: + dependency: "direct main" + description: + name: provider + sha256: c8a055ee5ce3fd98d6fc872478b03823ffdb448699c6ebdbbc71d59b596fd48c + url: "https://pub.dev" + source: hosted + version: "6.1.2" pub_semver: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 29c5977..d984ac4 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -59,7 +59,7 @@ dependencies: dio: ^5.6.0 flutter_file_dialog: ^3.0.2 glassmorphism: ^3.0.0 - + provider: ^6.0.5 dev_dependencies: flutter_test: