diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 3aa588e..a0bd446 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -3,6 +3,8 @@ + + UIApplicationSupportsIndirectInputEvents NSLocationWhenInUseUsageDescription - We need your location to show it on the map. - NSLocationAlwaysAndWhenInUseUsageDescription - We need your location to show it on the map even in background. + Cette application a besoin de votre position pour afficher votre localisation sur la carte + NSLocationAlwaysUsageDescription + Cette application a besoin de votre position pour afficher votre localisation sur la carte GIDClientID 521527250907-3i1qe2656eojs8k9hjdi573j09i9p41m.apps.googleusercontent.com diff --git a/lib/components/map/map_content.dart b/lib/components/map/map_content.dart index 93e8747..eca342f 100644 --- a/lib/components/map/map_content.dart +++ b/lib/components/map/map_content.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; +import 'package:geolocator/geolocator.dart'; class MapContent extends StatefulWidget { const MapContent({super.key}); @@ -9,22 +10,100 @@ class MapContent extends StatefulWidget { } class _MapContentState extends State { - final LatLng _initialPosition = const LatLng(48.8566, 2.3522); // Paris + GoogleMapController? _mapController; + LatLng _initialPosition = const LatLng(48.8566, 2.3522); // Paris par défaut final TextEditingController _searchController = TextEditingController(); + bool _isLoadingLocation = false; + Position? _currentPosition; + + @override + void initState() { + super.initState(); + _getCurrentLocation(); + } @override void dispose() { _searchController.dispose(); + _mapController?.dispose(); super.dispose(); } + // Obtenir la position actuelle + Future _getCurrentLocation() async { + setState(() { + _isLoadingLocation = true; + }); + + try { + // Vérifier si la localisation est activée + bool serviceEnabled = await Geolocator.isLocationServiceEnabled(); + if (!serviceEnabled) { + _showError('Veuillez activer les services de localisation'); + setState(() { + _isLoadingLocation = false; + }); + return; + } + + // Vérifier les permissions + LocationPermission permission = await Geolocator.checkPermission(); + if (permission == LocationPermission.denied) { + permission = await Geolocator.requestPermission(); + if (permission == LocationPermission.denied) { + _showError('Permission de localisation refusée'); + setState(() { + _isLoadingLocation = false; + }); + return; + } + } + + if (permission == LocationPermission.deniedForever) { + _showError('Permission de localisation refusée définitivement'); + setState(() { + _isLoadingLocation = false; + }); + return; + } + + // Obtenir la position actuelle + Position position = await Geolocator.getCurrentPosition( + desiredAccuracy: LocationAccuracy.high, + ); + + setState(() { + _currentPosition = position; + _initialPosition = LatLng(position.latitude, position.longitude); + _isLoadingLocation = false; + }); + + // Animer la caméra vers la position actuelle + if (_mapController != null) { + _mapController!.animateCamera( + CameraUpdate.newLatLngZoom(_initialPosition, 14), + ); + } + } catch (e) { + _showError('Erreur lors de la récupération de la position: $e'); + setState(() { + _isLoadingLocation = false; + }); + } + } + + void _showError(String message) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text(message), backgroundColor: Colors.red), + ); + } + void _searchLocation() { - // TODO: Implémenter la logique de recherche final searchQuery = _searchController.text.trim(); if (searchQuery.isNotEmpty) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text('Recherche de: $searchQuery')), - ); + ScaffoldMessenger.of( + context, + ).showSnackBar(SnackBar(content: Text('Recherche de: $searchQuery'))); } } @@ -50,65 +129,62 @@ class _MapContentState extends State { ), onSubmitted: (_) => _searchLocation(), ), - - const SizedBox(height: 8), - - // Bouton chercher - SizedBox( - width: double.infinity, - height: 48, - child: ElevatedButton( - onPressed: _searchLocation, - style: ElevatedButton.styleFrom( - backgroundColor: Theme.of(context).colorScheme.primary, - foregroundColor: Colors.white, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12.0), - ), - ), - child: const Text( - 'Chercher', - style: TextStyle(fontSize: 16, fontWeight: FontWeight.w500), - ), - ), - ), - - const SizedBox(height: 8), - - // Container avec la carte + + const SizedBox(height: 12), + + // Google Maps Expanded( - child: Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(16.0), - boxShadow: [ - BoxShadow( - color: Colors.black.withValues(alpha: 0.1), - blurRadius: 8, - offset: const Offset(0, 2), + child: Stack( + children: [ + ClipRRect( + borderRadius: BorderRadius.circular(16), + child: GoogleMap( + initialCameraPosition: CameraPosition( + target: _initialPosition, + zoom: 14, + ), + onMapCreated: (GoogleMapController controller) { + _mapController = controller; + }, + myLocationEnabled: true, + myLocationButtonEnabled: false, + zoomControlsEnabled: false, ), - ], - ), - child: ClipRRect( - borderRadius: BorderRadius.circular(16.0), - child: GoogleMap( - mapType: MapType.normal, - initialCameraPosition: CameraPosition( - target: _initialPosition, - zoom: 12, - ), - onMapCreated: (GoogleMapController controller) {}, - myLocationEnabled: true, - myLocationButtonEnabled: true, - zoomControlsEnabled: true, - compassEnabled: true, ), - ), + + // Indicateur de chargement + if (_isLoadingLocation) + Center( + child: Container( + padding: EdgeInsets.all(16), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(12), + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + CircularProgressIndicator(), + SizedBox(height: 8), + Text('Localisation en cours...'), + ], + ), + ), + ), + ], ), ), ], ), ), ), + + // Bouton flottant pour recentrer sur la position actuelle + floatingActionButton: FloatingActionButton( + onPressed: _getCurrentLocation, + tooltip: 'Ma position', + child: Icon(Icons.my_location), + ), ); } } diff --git a/lib/main.dart b/lib/main.dart index 8e97b25..aee12ec 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -53,16 +53,16 @@ class MyApp extends StatelessWidget { create: (context) => ThemeBloc()..add(ThemeLoadRequested()), ), BlocProvider( - create: (context) => AuthBloc( - authRepository: context.read(), - )..add(AuthCheckRequested()), + create: (context) => + AuthBloc(authRepository: context.read()) + ..add(AuthCheckRequested()), ), - BlocProvider(create: (context) => GroupBloc( - context.read(), - )), - BlocProvider(create: (context) => TripBloc( - tripRepository: context.read(), - ), + BlocProvider( + create: (context) => GroupBloc(context.read()), + ), + BlocProvider( + create: (context) => + TripBloc(tripRepository: context.read()), ), BlocProvider(create: (context) => UserBloc()), ], @@ -86,14 +86,7 @@ class MyApp extends StatelessWidget { ), useMaterial3: true, ), - home: BlocBuilder( - builder: (context, authState) { - if (authState is AuthAuthenticated) { - return const HomePage(); - } - return const LoginPage(); - }, - ), + home: const LoginPage(), routes: { '/login': (context) => const LoginPage(), '/signup': (context) => const SignUpPage(), diff --git a/pubspec.lock b/pubspec.lock index 13b4fbc..392c30f 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,10 +5,18 @@ packages: dependency: transitive description: name: _flutterfire_internals - sha256: "23d16f00a2da8ffa997c782453c73867b0609bd90435195671a54de38a3566df" + sha256: f871a7d1b686bea1f13722aa51ab31554d05c81f47054d6de48cc8c45153508b url: "https://pub.dev" source: hosted - version: "1.3.62" + version: "1.3.63" + args: + dependency: transitive + description: + name: args + sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 + url: "https://pub.dev" + source: hosted + version: "2.7.0" async: dependency: transitive description: @@ -29,10 +37,10 @@ packages: dependency: transitive description: name: bloc - sha256: "106842ad6569f0b60297619e9e0b1885c2fb9bf84812935490e6c5275777804e" + sha256: a2cebb899f91d36eeeaa55c7b20b5915db5a9df1b8fd4a3c9c825e22e474537d url: "https://pub.dev" source: hosted - version: "8.1.4" + version: "9.1.0" boolean_selector: dependency: transitive description: @@ -61,26 +69,26 @@ packages: dependency: "direct main" description: name: cloud_firestore - sha256: af66aeffe5943d582c0f655ec860433dbd773ac4a4ffc62c11960b52a18833fe + sha256: ea3fe98eaf0c3b675ab2a242d98430518da60f89d5cc9774df7b2d9110aaf160 url: "https://pub.dev" source: hosted - version: "6.0.2" + version: "6.0.3" cloud_firestore_platform_interface: dependency: transitive description: name: cloud_firestore_platform_interface - sha256: "494dd3d275a0259e3ba08b442b54e64839b0cf58352a50fe97eb67cacf3bad28" + sha256: b5592862c451ebfd229b430907b6feb2082333d6e5a61d0eafd547c2afc6f68e url: "https://pub.dev" source: hosted - version: "7.0.2" + version: "7.0.3" cloud_firestore_web: dependency: transitive description: name: cloud_firestore_web - sha256: "85b7b071c23eecbbbb47a9fbd2cfdb1b6af20f2323663fd90234d91a064f0584" + sha256: eca0337985e0eedcef8a3e5380950af01c0853951b6b8427e7909115d81d7b9c url: "https://pub.dev" source: hosted - version: "5.0.2" + version: "5.0.3" collection: dependency: transitive description: @@ -89,6 +97,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.19.1" + crypto: + dependency: transitive + description: + name: crypto + sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" + url: "https://pub.dev" + source: hosted + version: "3.0.6" csslib: dependency: transitive description: @@ -105,6 +121,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.8" + dbus: + dependency: transitive + description: + name: dbus + sha256: "79e0c23480ff85dc68de79e2cd6334add97e48f7f4865d17686dd6ea81a47e8c" + url: "https://pub.dev" + source: hosted + version: "0.7.11" equatable: dependency: "direct main" description: @@ -141,50 +165,58 @@ packages: dependency: "direct main" description: name: firebase_auth - sha256: "735f857c9363376eeb585e7ba57e67e5f495202cd3f609902b8769795fd823bc" + sha256: "3150a56fc0f20b4b926e1343bfdca3acb591a0aa1c95bae5426353f384085352" url: "https://pub.dev" source: hosted - version: "6.1.0" + version: "6.1.1" firebase_auth_platform_interface: dependency: transitive description: name: firebase_auth_platform_interface - sha256: "5badda0ea5048ffbb1726169cf5530539490de8055c3bd43f4f9cd5fcef8e556" + sha256: "7bc50c0d74dd8f4c72d7840ae64ea7b638f203d089e5c4a90a157b2f2ead1963" url: "https://pub.dev" source: hosted - version: "8.1.2" + version: "8.1.3" firebase_auth_web: dependency: transitive description: name: firebase_auth_web - sha256: "07c889d2c56e648ed30225e819801d7e45542747a658d9c385520de35d312dec" + sha256: "351dcb82bc542e21a426cd97ffcc40d7232981dafc3fd89a6c932876a09240e1" url: "https://pub.dev" source: hosted - version: "6.0.3" + version: "6.0.4" firebase_core: dependency: "direct main" description: name: firebase_core - sha256: "4dd96f05015c0dcceaa47711394c32971aee70169625d5e2477e7676c01ce0ee" + sha256: "132e1c311bc41e7d387b575df0aacdf24efbf4930365eb61042be5bde3978f03" url: "https://pub.dev" source: hosted - version: "4.1.1" + version: "4.2.0" firebase_core_platform_interface: dependency: transitive description: name: firebase_core_platform_interface - sha256: "5873a370f0d232918e23a5a6137dbe4c2c47cf017301f4ea02d9d636e52f60f0" + sha256: cccb4f572325dc14904c02fcc7db6323ad62ba02536833dddb5c02cac7341c64 url: "https://pub.dev" source: hosted - version: "6.0.1" + version: "6.0.2" firebase_core_web: dependency: transitive description: name: firebase_core_web - sha256: "61a51037312dac781f713308903bb7a1762a7f92f7bc286a3a0947fb2a713b82" + sha256: ecde2def458292404a4fcd3731ee4992fd631a0ec359d2d67c33baa8da5ec8ae url: "https://pub.dev" source: hosted - version: "3.1.1" + version: "3.2.0" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be + url: "https://pub.dev" + source: hosted + version: "1.1.1" flutter: dependency: "direct main" description: flutter @@ -194,26 +226,26 @@ packages: dependency: "direct main" description: name: flutter_bloc - sha256: b594505eac31a0518bdcb4b5b79573b8d9117b193cc80cc12e17d639b10aa27a + sha256: cf51747952201a455a1c840f8171d273be009b932c75093020f9af64f2123e38 url: "https://pub.dev" source: hosted - version: "8.1.6" + version: "9.1.1" flutter_lints: dependency: "direct dev" description: name: flutter_lints - sha256: "5398f14efa795ffb7a33e9b6a08798b26a180edac4ad7db3f231e40f82ce11e1" + sha256: "3105dc8492f6183fb076ccf1f351ac3d60564bff92e20bfc4af9cc1651f4e7e1" url: "https://pub.dev" source: hosted - version: "5.0.0" + version: "6.0.0" flutter_plugin_android_lifecycle: dependency: transitive description: name: flutter_plugin_android_lifecycle - sha256: b0694b7fb1689b0e6cc193b3f1fcac6423c4f93c74fb20b806c6b6f196db0c31 + sha256: "306f0596590e077338312f38837f595c04f28d6cdeeac392d3d74df2f0003687" url: "https://pub.dev" source: hosted - version: "2.0.30" + version: "2.0.32" flutter_test: dependency: "direct dev" description: flutter @@ -224,6 +256,70 @@ packages: description: flutter source: sdk version: "0.0.0" + geoclue: + dependency: transitive + description: + name: geoclue + sha256: c2a998c77474fc57aa00c6baa2928e58f4b267649057a1c76738656e9dbd2a7f + url: "https://pub.dev" + source: hosted + version: "0.1.1" + geolocator: + dependency: "direct main" + description: + name: geolocator + sha256: "79939537046c9025be47ec645f35c8090ecadb6fe98eba146a0d25e8c1357516" + url: "https://pub.dev" + source: hosted + version: "14.0.2" + geolocator_android: + dependency: transitive + description: + name: geolocator_android + sha256: "179c3cb66dfa674fc9ccbf2be872a02658724d1c067634e2c427cf6df7df901a" + url: "https://pub.dev" + source: hosted + version: "5.0.2" + geolocator_apple: + dependency: transitive + description: + name: geolocator_apple + sha256: dbdd8789d5aaf14cf69f74d4925ad1336b4433a6efdf2fce91e8955dc921bf22 + url: "https://pub.dev" + source: hosted + version: "2.3.13" + geolocator_linux: + dependency: transitive + description: + name: geolocator_linux + sha256: c4e966f0a7a87e70049eac7a2617f9e16fd4c585a26e4330bdfc3a71e6a721f3 + url: "https://pub.dev" + source: hosted + version: "0.2.3" + geolocator_platform_interface: + dependency: transitive + description: + name: geolocator_platform_interface + sha256: "30cb64f0b9adcc0fb36f628b4ebf4f731a2961a0ebd849f4b56200205056fe67" + url: "https://pub.dev" + source: hosted + version: "4.2.6" + geolocator_web: + dependency: transitive + description: + name: geolocator_web + sha256: b1ae9bdfd90f861fde8fd4f209c37b953d65e92823cb73c7dee1fa021b06f172 + url: "https://pub.dev" + source: hosted + version: "4.1.3" + geolocator_windows: + dependency: transitive + description: + name: geolocator_windows + sha256: "175435404d20278ffd220de83c2ca293b73db95eafbdc8131fe8609be1421eb6" + url: "https://pub.dev" + source: hosted + version: "0.2.5" google_identity_services_web: dependency: transitive description: @@ -252,10 +348,10 @@ packages: dependency: transitive description: name: google_maps_flutter_android - sha256: a6c9d43f6a944ff4bae5c3deb34817970ac3d591dcd7f5bd2ea450ab9e9c514a + sha256: f820a3990d4ff23e3baf01ce794f7f08cca9a9ce6c875ec96882d605f6f039df url: "https://pub.dev" source: hosted - version: "2.18.2" + version: "2.18.4" google_maps_flutter_ios: dependency: transitive description: @@ -292,10 +388,10 @@ packages: dependency: transitive description: name: google_sign_in_android - sha256: "7abdfa0088dc8f7d08eb3dbb1665a72bcb5b37afa256c9ec5d21e1e2d7503e5c" + sha256: "7a0d3b7e73e21d88612ebbb1942e91ee1eb35ed3086b1a0a3398b2248be29034" url: "https://pub.dev" source: hosted - version: "7.2.0" + version: "7.2.2" google_sign_in_ios: dependency: transitive description: @@ -320,6 +416,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.0" + gsettings: + dependency: transitive + description: + name: gsettings + sha256: "1b0ce661f5436d2db1e51f3c4295a49849f03d304003a7ba177d01e3a858249c" + url: "https://pub.dev" + source: hosted + version: "0.2.8" html: dependency: transitive description: @@ -344,14 +448,6 @@ packages: url: "https://pub.dev" source: hosted version: "4.1.2" - js: - dependency: transitive - description: - name: js - sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 - url: "https://pub.dev" - source: hosted - version: "0.6.7" leak_tracker: dependency: transitive description: @@ -380,34 +476,34 @@ packages: dependency: transitive description: name: lints - sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7 + sha256: a5e2b223cb7c9c8efdc663ef484fdd95bb243bff242ef5b13e26883547fce9a0 url: "https://pub.dev" source: hosted - version: "5.1.1" + version: "6.0.0" location: dependency: "direct main" description: name: location - sha256: "06be54f682c9073cbfec3899eb9bc8ed90faa0e17735c9d9fa7fe426f5be1dd1" + sha256: b080053c181c7d152c43dd576eec6436c40e25f326933051c330da563ddd5333 url: "https://pub.dev" source: hosted - version: "5.0.3" + version: "8.0.1" location_platform_interface: dependency: transitive description: name: location_platform_interface - sha256: "8aa1d34eeecc979d7c9fe372931d84f6d2ebbd52226a54fe1620de6fdc0753b1" + sha256: ca8700bb3f6b1e8b2afbd86bd78b2280d116c613ca7bfa1d4d7b64eba357d749 url: "https://pub.dev" source: hosted - version: "3.1.2" + version: "6.0.1" location_web: dependency: transitive description: name: location_web - sha256: ec484c66e8a4ff1ee5d044c203f4b6b71e3a0556a97b739a5bc9616de672412b + sha256: b8e3add5efe0d65c5e692b7a135d80a4015c580d3ea646fa71973e97668dd868 url: "https://pub.dev" source: hosted - version: "4.2.0" + version: "6.0.1" matcher: dependency: transitive description: @@ -440,6 +536,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.0" + package_info_plus: + dependency: transitive + description: + name: package_info_plus + sha256: "16eee997588c60225bda0488b6dcfac69280a6b7a3cf02c741895dd370a02968" + url: "https://pub.dev" + source: hosted + version: "8.3.1" + package_info_plus_platform_interface: + dependency: transitive + description: + name: package_info_plus_platform_interface + sha256: "202a487f08836a592a6bd4f901ac69b3a8f146af552bbd14407b6b41e1c3f086" + url: "https://pub.dev" + source: hosted + version: "3.2.1" path: dependency: transitive description: @@ -460,10 +572,10 @@ packages: dependency: transitive description: name: path_provider_android - sha256: "993381400e94d18469750e5b9dcb8206f15bc09f9da86b9e44a9b0092a0066db" + sha256: e122c5ea805bb6773bb12ce667611265980940145be920cd09a4b0ec0285cb16 url: "https://pub.dev" source: hosted - version: "2.2.18" + version: "2.2.20" path_provider_foundation: dependency: transitive description: @@ -496,6 +608,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.3.0" + petitparser: + dependency: transitive + description: + name: petitparser + sha256: "1a97266a94f7350d30ae522c0af07890c70b8e62c71e8e3920d1db4d23c057d1" + url: "https://pub.dev" + source: hosted + version: "7.0.1" platform: dependency: transitive description: @@ -540,10 +660,10 @@ packages: dependency: transitive description: name: shared_preferences_android - sha256: bd14436108211b0d4ee5038689a56d4ae3620fd72fd6036e113bf1345bc74d9e + sha256: "34266009473bf71d748912da4bf62d439185226c03e01e2d9687bc65bbfcb713" url: "https://pub.dev" source: hosted - version: "2.4.13" + version: "2.4.15" shared_preferences_foundation: dependency: transitive description: @@ -597,6 +717,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.10.1" + sprintf: + dependency: transitive + description: + name: sprintf + sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23" + url: "https://pub.dev" + source: hosted + version: "7.0.0" stack_trace: dependency: transitive description: @@ -653,6 +781,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.4.0" + uuid: + dependency: transitive + description: + name: uuid + sha256: a5be9ef6618a7ac1e964353ef476418026db906c4facdedaa299b7a2e71690ff + url: "https://pub.dev" + source: hosted + version: "4.5.1" vector_math: dependency: transitive description: @@ -677,6 +813,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.1" + win32: + dependency: transitive + description: + name: win32 + sha256: d7cb55e04cd34096cd3a79b3330245f54cb96a370a1c27adb3c84b917de8b08e + url: "https://pub.dev" + source: hosted + version: "5.15.0" xdg_directories: dependency: transitive description: @@ -685,6 +829,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.0" + xml: + dependency: transitive + description: + name: xml + sha256: "971043b3a0d3da28727e40ed3e0b5d18b742fa5a68665cca88e74b7876d5e025" + url: "https://pub.dev" + source: hosted + version: "6.6.1" sdks: dart: ">=3.9.2 <4.0.0" - flutter: ">=3.29.0" + flutter: ">=3.35.0" diff --git a/pubspec.yaml b/pubspec.yaml index 40259da..8847e19 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -34,8 +34,8 @@ dependencies: shared_preferences: ^2.2.2 path_provider: ^2.1.1 bcrypt: ^1.1.3 - location: ^5.0.0 - flutter_bloc : ^8.1.3 + location: ^8.0.1 + flutter_bloc : ^9.1.1 equatable: ^2.0.5 # The following adds the Cupertino Icons font to your application. @@ -47,6 +47,7 @@ dependencies: cloud_firestore: ^6.0.2 google_sign_in: ^7.2.0 google_sign_in_platform_interface: ^3.1.0 + geolocator: ^14.0.2 dev_dependencies: flutter_test: @@ -57,7 +58,7 @@ dev_dependencies: # activated in the `analysis_options.yaml` file located at the root of your # package. See that file for information about deactivating specific lint # rules and activating additional ones. - flutter_lints: ^5.0.0 + flutter_lints: ^6.0.0 # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec