From 7412d1e074884544e53d3a9a36ad7c546d5ec8ca Mon Sep 17 00:00:00 2001 From: Mohamed Nouffer Date: Tue, 31 Oct 2023 14:12:48 +0530 Subject: [PATCH] added GPS feature --- lib/model/gps_data.dart | 37 +++++ .../destination/destination_controller.dart | 24 ++- lib/pages/gps/gps_page.dart | 153 ++++++++++++++++++ lib/pages/index/index_controller.dart | 2 +- lib/pages/index/index_page.dart | 12 ++ lib/routes/app_pages.dart | 6 + lib/routes/app_routes.dart | 1 + lib/utils/database_gps.dart | 72 +++++++++ pubspec.lock | 104 ++++++------ 9 files changed, 352 insertions(+), 59 deletions(-) create mode 100644 lib/model/gps_data.dart create mode 100644 lib/pages/gps/gps_page.dart create mode 100644 lib/utils/database_gps.dart diff --git a/lib/model/gps_data.dart b/lib/model/gps_data.dart new file mode 100644 index 0000000..f49431e --- /dev/null +++ b/lib/model/gps_data.dart @@ -0,0 +1,37 @@ +class GpsData { + int id; + String team_name; + String event_code; + double lat; + double lon; + int created_at; + + GpsData( + {required this.id, + required this.team_name, + required this.event_code, + required this.lat, + required this.lon, + required this.created_at}); + + factory GpsData.fromMap(Map json) { + return GpsData( + id: json["id"], + team_name: json["team_name"], + event_code: json["event_code"], + lat: json["lat"], + lon: json["lon"], + created_at: json["created_at"]); + } + + Map toMap() { + return { + 'id': id, + 'team_name': team_name, + 'event_code': event_code, + 'lat': lat, + 'lon': lon, + 'created_at': created_at + }; + } +} diff --git a/lib/pages/destination/destination_controller.dart b/lib/pages/destination/destination_controller.dart index 67ac878..f2adaff 100644 --- a/lib/pages/destination/destination_controller.dart +++ b/lib/pages/destination/destination_controller.dart @@ -9,6 +9,7 @@ import 'package:intl/intl.dart'; import 'package:latlong2/latlong.dart'; import 'package:rogapp/main.dart'; import 'package:rogapp/model/destination.dart'; +import 'package:rogapp/model/gps_data.dart'; import 'package:rogapp/pages/camera/camera_page.dart'; import 'package:rogapp/pages/index/index_controller.dart'; import 'package:rogapp/routes/app_pages.dart'; @@ -17,6 +18,7 @@ import 'package:rogapp/services/external_service.dart'; import 'package:rogapp/services/location_service.dart'; import 'package:rogapp/services/maxtrix_service.dart'; import 'package:rogapp/services/perfecture_service.dart'; +import 'package:rogapp/utils/database_gps.dart'; import 'package:rogapp/utils/database_helper.dart'; import 'package:rogapp/widgets/bottom_sheet_new.dart'; import 'dart:async'; @@ -508,6 +510,22 @@ class DestinationController extends GetxController { final la = position.latitude; final ln = position.longitude; + print("--- gps is ${la}, ${ln}"); + + //add gps to database + GpsDatabaseHelper db = GpsDatabaseHelper.instance; + final team_name = indexController.currentUser[0]["user"]['team_name']; + final event_code = indexController.currentUser[0]["user"]["event_code"]; + print("--- curr gps is ${la}, ${ln}"); + GpsData gps_data = GpsData( + id: 0, + team_name: team_name, + event_code: event_code, + lat: la, + lon: ln, + created_at: DateTime.now().microsecondsSinceEpoch); + await db.insertGps(gps_data); + for (GeoJsonFeature fs in indexController.locations[0].collection) { GeoJsonMultiPoint mp = fs.geometry as GeoJsonMultiPoint; LatLng pt = LatLng(mp.geoSerie!.geoPoints[0].latitude, @@ -643,12 +661,6 @@ class DestinationController extends GetxController { await checkForCheckin(); } - @override - void onClose() { - super.onClose(); - super.onClose(); - } - @override void onInit() async { startGame(); diff --git a/lib/pages/gps/gps_page.dart b/lib/pages/gps/gps_page.dart new file mode 100644 index 0000000..fde9076 --- /dev/null +++ b/lib/pages/gps/gps_page.dart @@ -0,0 +1,153 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:flutter_map/flutter_map.dart'; +import 'package:get/get.dart'; +import 'package:latlong2/latlong.dart'; +import 'package:rogapp/model/gps_data.dart'; +import 'package:rogapp/pages/destination/destination_controller.dart'; +import 'package:rogapp/pages/index/index_controller.dart'; +import 'package:rogapp/utils/database_gps.dart'; +import 'package:rogapp/widgets/base_layer_widget.dart'; + +class GpsPage extends StatefulWidget { + const GpsPage({super.key}); + + @override + State createState() => _GpsPageState(); +} + +class _GpsPageState extends State { + var gpsData = [].obs; + MapController? mapController; + StreamSubscription? subscription; + final IndexController indexController = Get.find(); + final DestinationController destinationController = + Get.find(); + + @override + void initState() { + super.initState(); + loadGpsData(); + } + + void loadGpsData() async { + final team_name = indexController.currentUser[0]["user"]['team_name']; + final event_code = indexController.currentUser[0]["user"]["event_code"]; + GpsDatabaseHelper db = GpsDatabaseHelper.instance; + gpsData.value = await db.getGPSData(team_name, event_code); + print("--- gps data ${gpsData.value[gpsData.length - 1].lat} ----"); + } + + Widget getMarkerShape(GpsData i) { + return Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + InkWell( + onTap: () {}, + child: Container( + height: 22, + width: 22, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Colors.purple.shade300, + border: Border.all( + color: Colors.purple, + width: 3, + style: BorderStyle.solid)), + child: const Stack( + alignment: Alignment.center, + children: [ + Icon( + Icons.circle, + size: 6.0, + ), + ], + )), + ), + Container( + color: Colors.white, + child: Text( + DateTime.fromMicrosecondsSinceEpoch(i.created_at) + .hour + .toString() + + ":" + + DateTime.fromMicrosecondsSinceEpoch(i.created_at) + .minute + .toString(), + // ":" + + // DateTime.fromMicrosecondsSinceEpoch(i.created_at) + // .second + // .toString(), + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: Colors.black, + ))), + ], + ); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text("GPS way points"), + ), + body: Container( + child: Obx( + () => FlutterMap( + mapController: mapController, + options: MapOptions( + maxZoom: 18.4, + onMapReady: () { + subscription = + mapController!.mapEventStream.listen((MapEvent mapEvent) { + if (mapEvent is MapEventMoveStart) { + //print(DateTime.now().toString() + ' [MapEventMoveStart] START'); + // do something + } + if (mapEvent is MapEventMoveEnd) {} + }); + }, + //center: LatLng(37.15319600454702, 139.58765950528198), + bounds: indexController.currentBound.isNotEmpty + ? indexController.currentBound[0] + : LatLngBounds.fromPoints([ + LatLng(35.03999881162295, 136.40587119778962), + LatLng(36.642756778706904, 137.95226720406063) + ]), + zoom: 1, + interactiveFlags: InteractiveFlag.pinchZoom | InteractiveFlag.drag, + + onPositionChanged: (MapPosition pos, isvalue) { + indexController.currentBound = [pos.bounds!]; + }, + onTap: (tapPos, cord) {}, // Hide popup when the map is tapped. + ), + children: [ + const BaseLayer(), + MarkerLayer( + markers: gpsData.map((i) { + return Marker( + anchorPos: AnchorPos.exactly(Anchor(108.0, 18.0)), + height: 32.0, + width: 120.0, + point: LatLng(i.lat, i.lon), + builder: (ctx) { + return getMarkerShape(i); + // return Container( + // width: 40, + // height: 40, + // color: Colors.orange, + // ); + }, + ); + }).toList(), + ) + ], + ), + )), + ); + } +} diff --git a/lib/pages/index/index_controller.dart b/lib/pages/index/index_controller.dart index e357393..4f6ed89 100644 --- a/lib/pages/index/index_controller.dart +++ b/lib/pages/index/index_controller.dart @@ -255,7 +255,7 @@ class IndexController extends GetxController { } void changeUser(Map value, {bool replace = true}) { - ////print("---- change user to $value -----"); + //print("---- change user to $value -----"); currentUser.clear(); currentUser.add(value); if (replace) { diff --git a/lib/pages/index/index_page.dart b/lib/pages/index/index_page.dart index ab7a067..2cc1205 100644 --- a/lib/pages/index/index_page.dart +++ b/lib/pages/index/index_page.dart @@ -1,9 +1,11 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; +import 'package:rogapp/model/gps_data.dart'; import 'package:rogapp/pages/destination/destination_controller.dart'; import 'package:rogapp/pages/drawer/drawer_page.dart'; import 'package:rogapp/pages/index/index_controller.dart'; import 'package:rogapp/routes/app_pages.dart'; +import 'package:rogapp/utils/database_gps.dart'; import 'package:rogapp/widgets/list_widget.dart'; import 'package:rogapp/widgets/map_widget.dart'; @@ -23,6 +25,16 @@ class IndexPage extends GetView { appBar: AppBar( title: Text("add_location".tr), actions: [ + IconButton( + onPressed: () async { + // GpsDatabaseHelper db = GpsDatabaseHelper.instance; + // List data = await db.getGPSData( + // indexController.currentUser[0]["user"]['team_name'], + // indexController.currentUser[0]["user"]["event_code"]); + // print("GPS data is ${data.length}"); + Get.toNamed(AppPages.GPS); + }, + icon: const Icon(Icons.telegram)), IconButton( onPressed: () { Get.toNamed(AppPages.HISTORY); diff --git a/lib/routes/app_pages.dart b/lib/routes/app_pages.dart index a8222d1..2c7cca0 100644 --- a/lib/routes/app_pages.dart +++ b/lib/routes/app_pages.dart @@ -4,6 +4,7 @@ import 'package:rogapp/pages/category/category_page.dart'; import 'package:rogapp/pages/changepassword/change_password_page.dart'; import 'package:rogapp/pages/city/city_page.dart'; import 'package:rogapp/pages/destination/destination_binding.dart'; +import 'package:rogapp/pages/gps/gps_page.dart'; import 'package:rogapp/pages/history/history_page.dart'; import 'package:rogapp/pages/home/home_binding.dart'; import 'package:rogapp/pages/home/home_page.dart'; @@ -46,6 +47,7 @@ class AppPages { static const CAMERA_PAGE = Routes.CAMERA_PAGE; static const PROGRESS = Routes.PROGRESS; static const HISTORY = Routes.HISTORY; + static const GPS = Routes.GPS; static final routes = [ GetPage( @@ -102,6 +104,10 @@ class AppPages { GetPage( name: Routes.HISTORY, page: () => const HistoryPage(), + ), + GetPage( + name: Routes.GPS, + page: () => const GpsPage(), ) ]; } diff --git a/lib/routes/app_routes.dart b/lib/routes/app_routes.dart index 753b9fc..acc45f6 100644 --- a/lib/routes/app_routes.dart +++ b/lib/routes/app_routes.dart @@ -25,4 +25,5 @@ abstract class Routes { static const CAMERA_PAGE = '/camera_page'; static const PROGRESS = '/progress'; static const HISTORY = '/history'; + static const GPS = '/gp'; } diff --git a/lib/utils/database_gps.dart b/lib/utils/database_gps.dart new file mode 100644 index 0000000..a0c4c81 --- /dev/null +++ b/lib/utils/database_gps.dart @@ -0,0 +1,72 @@ +import 'dart:io'; +import 'package:path/path.dart'; +import 'package:path_provider/path_provider.dart'; +import 'package:rogapp/model/gps_data.dart'; +import 'package:sqflite/sqflite.dart'; + +class GpsDatabaseHelper { + GpsDatabaseHelper._privateConstructor(); + static final GpsDatabaseHelper instance = + GpsDatabaseHelper._privateConstructor(); + static Database? _database; + Future get database async => _database ??= await _initDatabase(); + + Future _initDatabase() async { + Directory documentDirectory = await getApplicationDocumentsDirectory(); + String path = join(documentDirectory.path, 'rog.db'); + // return await openDatabase( + // path, + // version: 1, + // onCreate: _onCreate, + // ); + return openDatabase( + join( + await getDatabasesPath(), + 'gps.db', + ), + version: 1, + onCreate: _onCreate); + } + + Future _onCreate(Database db, int version) async { + await db.execute(''' + CREATE TABLE gps( + id INTEGER PRIMARY KEY AUTOINCREMENT, + team_name TEXT, + event_code TEXT, + lat REAL, + lon REAL, + created_at INTEGER + ) + '''); + } + + Future insertGps(GpsData gps) async { + Database db = await instance.database; + int? nextOrder = + Sqflite.firstIntValue(await db.rawQuery('SELECT MAX(id) FROM gps')); + nextOrder = nextOrder ?? 0; + nextOrder = nextOrder + 1; + gps.id = nextOrder; + print("---- insering ${gps.toMap()}"); + int res = await db.insert( + 'gps', + gps.toMap(), + conflictAlgorithm: ConflictAlgorithm.replace, + ); + //print("------ database helper insert $res-----------::::::::"); + return res; + } + + Future> getGPSData(String team_name, String event_code) async { + Database db = await instance.database; + var gpss = await db.query('gps', + where: "team_name = ? and event_code = ?", + whereArgs: [team_name, event_code], + orderBy: 'created_at'); + List gpsDatas = + gpss.isNotEmpty ? gpss.map((e) => GpsData.fromMap(e)).toList() : []; + print("--------- db list $gpsDatas"); + return gpsDatas; + } +} diff --git a/pubspec.lock b/pubspec.lock index 65bee01..5c246ae 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -13,10 +13,10 @@ packages: dependency: transitive description: name: archive - sha256: "49b1fad315e57ab0bbc15bcbb874e83116a1d78f77ebd500a4af6c9407d6b28e" + sha256: "7e0d52067d05f2e0324268097ba723b71cb41ac8a6a2b24d1edf9c536b987b03" url: "https://pub.dev" source: hosted - version: "3.3.8" + version: "3.4.6" args: dependency: transitive description: @@ -45,26 +45,26 @@ packages: dependency: transitive description: name: camera - sha256: f63f2687fb1795c36f7c57b18a03071880eabb0fd8b5291b0fcd3fb979cb0fb1 + sha256: "1f9010f0689774380fbcd7d6b7820a5157e8e97685fa66d619e1d1f58b3fdf93" url: "https://pub.dev" source: hosted - version: "0.10.5+4" + version: "0.10.5+5" camera_android: dependency: transitive description: name: camera_android - sha256: ed4f645848074166fc3b8e20350f83ca07e09a2becc1e185040ee561f955d4df + sha256: c978373b41a463c9edda3fea0a06966299f55db63232cd0f0d4efc21a59a0006 url: "https://pub.dev" source: hosted - version: "0.10.8+8" + version: "0.10.8+12" camera_avfoundation: dependency: transitive description: name: camera_avfoundation - sha256: "718b60ed2e22b4067fe6e2c0e9ebe2856c2de5c8b1289ba95d10db85b0b00bc2" + sha256: "9495e633cda700717bbe299b0979e6c4a08cee45f298945973dc9cf3e4c1cba5" url: "https://pub.dev" source: hosted - version: "0.9.13+4" + version: "0.9.13+6" camera_camera: dependency: "direct main" description: @@ -165,10 +165,10 @@ packages: dependency: transitive description: name: cross_file - sha256: fd832b5384d0d6da4f6df60b854d33accaaeb63aa9e10e736a87381f08dee2cb + sha256: "445db18de832dba8d851e287aff8ccf169bed30d2e94243cb54c7d2f1ed2142c" url: "https://pub.dev" source: hosted - version: "0.3.3+5" + version: "0.3.3+6" crypto: dependency: transitive description: @@ -221,10 +221,10 @@ packages: dependency: transitive description: name: file - sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d" + sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" url: "https://pub.dev" source: hosted - version: "6.1.4" + version: "7.0.0" file_selector_linux: dependency: transitive description: @@ -237,10 +237,10 @@ packages: dependency: transitive description: name: file_selector_macos - sha256: "182c3f8350cee659f7b115e956047ee3dc672a96665883a545e81581b9a82c72" + sha256: b15c3da8bd4908b9918111fa486903f5808e388b8d1c559949f584725a6594d6 url: "https://pub.dev" source: hosted - version: "0.9.3+2" + version: "0.9.3+3" file_selector_platform_interface: dependency: transitive description: @@ -282,10 +282,10 @@ packages: dependency: "direct main" description: name: flutter_image - sha256: b41c6cbf9462d8cbdeeb7b5dd84c7bca5176e9e4d6e8b968290e371ab758cc0c + sha256: e3662dc99ee90a8d17eb178bfbcaabaa96c11504d6e2bab53b9158ed0439910a url: "https://pub.dev" source: hosted - version: "4.1.8" + version: "4.1.9" flutter_keyboard_visibility: dependency: transitive description: @@ -410,10 +410,10 @@ packages: dependency: "direct main" description: name: flutter_riverpod - sha256: "1bd39b04f1bcd217a969589777ca6bd642d116e3e5de65c3e6a8e8bdd8b178ec" + sha256: bdba94be666ecb1beeb0f5a748d96cdd6a37215f27e6b48c7673b95cecb800c8 url: "https://pub.dev" source: hosted - version: "2.4.0" + version: "2.4.4" flutter_test: dependency: "direct dev" description: flutter @@ -423,10 +423,10 @@ packages: dependency: "direct main" description: name: flutter_typeahead - sha256: a3539f7a90246b152f569029dedcf0b842532d3f2a440701b520e0bf2acbcf42 + sha256: b9942bd5b7611a6ec3f0730c477146cffa4cd4b051077983ba67ddfc9e7ee818 url: "https://pub.dev" source: hosted - version: "4.6.2" + version: "4.8.0" flutter_web_plugins: dependency: transitive description: flutter @@ -436,10 +436,10 @@ packages: dependency: transitive description: name: font_awesome_flutter - sha256: "5fb789145cae1f4c3245c58b3f8fb287d055c26323879eab57a7bf0cfd1e45f3" + sha256: "52671aea66da73b58d42ec6d0912b727a42248dd9a7c76d6c20f275783c48c08" url: "https://pub.dev" source: hosted - version: "10.5.0" + version: "10.6.0" gallery_saver: dependency: "direct main" description: @@ -476,34 +476,34 @@ packages: dependency: transitive description: name: geolocator_android - sha256: "835ff5b4888a2f8eba128996494faf9c5d422785322a81dc0565b99e0f6c379d" + sha256: "93906636752ea4d4e778afa981fdfe7409f545b3147046300df194330044d349" url: "https://pub.dev" source: hosted - version: "4.2.2" + version: "4.3.1" geolocator_apple: dependency: transitive description: name: geolocator_apple - sha256: "36527c555f4c425f7d8fa8c7c07d67b78e3ff7590d40448051959e1860c1cfb4" + sha256: ab90ae811c42ec2f6021e01eca71df00dee6ff1e69d2c2dafd4daeb0b793f73d url: "https://pub.dev" source: hosted - version: "2.2.7" + version: "2.3.2" geolocator_platform_interface: dependency: transitive description: name: geolocator_platform_interface - sha256: af4d69231452f9620718588f41acc4cb58312368716bfff2e92e770b46ce6386 + sha256: b7aca62aa05d7e610c396a53a1936ff87fce2f735d76e93fde9269c341c46a25 url: "https://pub.dev" source: hosted - version: "4.0.7" + version: "4.1.1" geolocator_web: dependency: transitive description: name: geolocator_web - sha256: f68a122da48fcfff68bbc9846bb0b74ef651afe84a1b1f6ec20939de4d6860e1 + sha256: "59083f7e0871b78299918d92bf930a14377f711d2d1156c558cd5ebae6c20d58" url: "https://pub.dev" source: hosted - version: "2.1.6" + version: "2.2.0" geolocator_windows: dependency: transitive description: @@ -604,10 +604,10 @@ packages: dependency: transitive description: name: image - sha256: a72242c9a0ffb65d03de1b7113bc4e189686fc07c7147b8b41811d0dd0e0d9bf + sha256: "028f61960d56f26414eb616b48b04eb37d700cbe477b7fb09bf1d7ce57fd9271" url: "https://pub.dev" source: hosted - version: "4.0.17" + version: "4.1.3" image_picker: dependency: "direct main" description: @@ -620,10 +620,10 @@ packages: dependency: transitive description: name: image_picker_android - sha256: d32a997bcc4ee135aebca8e272b7c517927aa65a74b9c60a81a2764ef1a0462d + sha256: "0c7b83bbe2980c8a8e36e974f055e11e51675784e13a4762889feed0f3937ff2" url: "https://pub.dev" source: hosted - version: "0.8.7+5" + version: "0.8.8+1" image_picker_for_web: dependency: transitive description: @@ -900,18 +900,18 @@ packages: dependency: "direct main" description: name: permission_handler - sha256: "63e5216aae014a72fe9579ccd027323395ce7a98271d9defa9d57320d001af81" + sha256: bc56bfe9d3f44c3c612d8d393bd9b174eb796d706759f9b495ac254e4294baa5 url: "https://pub.dev" source: hosted - version: "10.4.3" + version: "10.4.5" permission_handler_android: dependency: transitive description: name: permission_handler_android - sha256: d74e77a5ecd38649905db0a7d05ef16bed42ff263b9efb73ed794317c5764ec3 + sha256: "59c6322171c29df93a22d150ad95f3aa19ed86542eaec409ab2691b8f35f9a47" url: "https://pub.dev" source: hosted - version: "10.3.4" + version: "10.3.6" permission_handler_apple: dependency: transitive description: @@ -924,10 +924,10 @@ packages: dependency: transitive description: name: permission_handler_platform_interface - sha256: "7c6b1500385dd1d2ca61bb89e2488ca178e274a69144d26bbd65e33eae7c02a9" + sha256: "6760eb5ef34589224771010805bea6054ad28453906936f843a8cc4d3a55c4a4" url: "https://pub.dev" source: hosted - version: "3.11.3" + version: "3.12.0" permission_handler_windows: dependency: transitive description: @@ -948,10 +948,10 @@ packages: dependency: transitive description: name: platform - sha256: ae68c7bfcd7383af3629daafb32fb4e8681c7154428da4febcff06200585f102 + sha256: "0a279f0707af40c890e80b1e9df8bb761694c074ba7e1d4ab1bc4b728e200b59" url: "https://pub.dev" source: hosted - version: "3.1.2" + version: "3.1.3" plugin_platform_interface: dependency: transitive description: @@ -1036,18 +1036,18 @@ packages: dependency: transitive description: name: riverpod - sha256: a600120d6f213a9922860eea1abc32597436edd5b2c4e73b91410f8c2af67d22 + sha256: "2af3d127a6e4e34b89b8f1f018086f5ded04b8e538174f0510bba3e4c0d878b1" url: "https://pub.dev" source: hosted - version: "2.4.0" + version: "2.4.4" shared_preferences: dependency: "direct main" description: name: shared_preferences - sha256: b7f41bad7e521d205998772545de63ff4e6c97714775902c199353f8bf1511ac + sha256: "81429e4481e1ccfb51ede496e916348668fd0921627779233bd24cc3ff6abd02" url: "https://pub.dev" source: hosted - version: "2.2.1" + version: "2.2.2" shared_preferences_android: dependency: transitive description: @@ -1068,10 +1068,10 @@ packages: dependency: transitive description: name: shared_preferences_linux - sha256: c2eb5bf57a2fe9ad6988121609e47d3e07bb3bdca5b6f8444e4cf302428a128a + sha256: "9f2cbcf46d4270ea8be39fa156d86379077c8a5228d9dfdb1164ae0bb93f1faa" url: "https://pub.dev" source: hosted - version: "2.3.1" + version: "2.3.2" shared_preferences_platform_interface: dependency: transitive description: @@ -1092,10 +1092,10 @@ packages: dependency: transitive description: name: shared_preferences_windows - sha256: f763a101313bd3be87edffe0560037500967de9c394a714cd598d945517f694f + sha256: "841ad54f3c8381c480d0c9b508b89a34036f512482c407e6df7a9c4aa2ef8f59" url: "https://pub.dev" source: hosted - version: "2.3.1" + version: "2.3.2" sky_engine: dependency: transitive description: flutter @@ -1337,10 +1337,10 @@ packages: dependency: transitive description: name: win32 - sha256: "9e82a402b7f3d518fb9c02d0e9ae45952df31b9bf34d77baf19da2de03fc2aaa" + sha256: "350a11abd2d1d97e0cc7a28a81b781c08002aa2864d9e3f192ca0ffa18b06ed3" url: "https://pub.dev" source: hosted - version: "5.0.7" + version: "5.0.9" wkt_parser: dependency: transitive description: