Merge branch 'development_mirza' into development_sikander
# Conflicts: # lib/provider/dashboard_provider_model.dart # lib/ui/landing/dashboard_screen.dart # lib/ui/login/login_screen.dart # lib/ui/login/verify_last_login_screen.dartmerge-requests/1/merge
						commit
						4817781fe1
					
				| @ -0,0 +1,7 @@ | ||||
| <svg id="interview_3_" data-name="interview (3)" xmlns="http://www.w3.org/2000/svg" width="27.258" height="27.258" viewBox="0 0 27.258 27.258"> | ||||
|   <path id="Path_4667" data-name="Path 4667" d="M7.663,248.55a4.22,4.22,0,1,0-5.175,0A5.07,5.07,0,0,0,0,252.918v1.711a.8.8,0,0,0,.8.8H9.352a.8.8,0,0,0,.8-.8v-1.711A5.07,5.07,0,0,0,7.663,248.55Zm-5.21-3.33a2.623,2.623,0,1,1,2.623,2.623A2.626,2.626,0,0,1,2.452,245.22Zm6.1,8.61H1.6v-.912a3.478,3.478,0,1,1,6.956,0v.912Zm0,0" transform="translate(0 -228.17)" fill="#989898"/> | ||||
|   <path id="Path_4668" data-name="Path 4668" d="M206.43,0H196.165A3.363,3.363,0,0,0,192.8,3.365v15.4a.8.8,0,0,0,1.278.639l3.208-2.406h9.143a3.363,3.363,0,0,0,3.365-3.365V3.365A3.363,3.363,0,0,0,206.43,0ZM208.2,13.629A1.766,1.766,0,0,1,206.43,15.4h-9.409a.8.8,0,0,0-.479.16L194.4,17.164V3.365A1.766,1.766,0,0,1,196.165,1.6H206.43A1.766,1.766,0,0,1,208.2,3.365Zm0,0" transform="translate(-182.536 0)" fill="#989898"/> | ||||
|   <path id="Path_4669" data-name="Path 4669" d="M266.419,80.332h-8.554a.8.8,0,1,0,0,1.6h8.554a.8.8,0,0,0,0-1.6Zm0,0" transform="translate(-243.381 -76.055)" fill="#989898"/> | ||||
|   <path id="Path_4670" data-name="Path 4670" d="M266.419,144.6h-8.554a.8.8,0,1,0,0,1.6h8.554a.8.8,0,0,0,0-1.6Zm0,0" transform="translate(-243.381 -136.903)" fill="#989898"/> | ||||
|   <path id="Path_4671" data-name="Path 4671" d="M262.142,208.867h-4.277a.8.8,0,1,0,0,1.6h4.277a.8.8,0,1,0,0-1.6Zm0,0" transform="translate(-243.381 -197.747)" fill="#989898"/> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 1.4 KiB | 
| @ -0,0 +1,7 @@ | ||||
| <svg xmlns="http://www.w3.org/2000/svg" width="25.898" height="25.9" viewBox="0 0 25.898 25.9"> | ||||
|   <g id="home_12_" data-name="home (12)" transform="translate(-0.022)"> | ||||
|     <path id="Path_4683" data-name="Path 4683" d="M351.362.759A.759.759,0,0,0,350.6,0h-3.251a.759.759,0,0,0-.759.759v.687l4.769,4.769Z" transform="translate(-329.039 0)" fill="#2e303a"/> | ||||
|     <path id="Path_4684" data-name="Path 4684" d="M25.221,11.259,14.661.7A2.391,2.391,0,0,0,11.28.7L.721,11.26A2.391,2.391,0,1,0,4.1,14.641l8.869-8.869,8.869,8.869a2.375,2.375,0,0,0,1.69.7h0a2.391,2.391,0,0,0,1.691-4.081Z" fill="#2e303a"/> | ||||
|     <path id="Path_4685" data-name="Path 4685" d="M65.238,156.525l-7.8,7.8a3.878,3.878,0,0,1-2.369,1.125v6.271a2.794,2.794,0,0,0,2.791,2.791H62.8a.759.759,0,0,0,.759-.759v-5.743h3.359v5.743a.759.759,0,0,0,.759.759h4.935a2.794,2.794,0,0,0,2.791-2.791v-6.271a3.879,3.879,0,0,1-2.368-1.125Z" transform="translate(-52.267 -148.607)" fill="#2e303a"/> | ||||
|   </g> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 955 B | 
| @ -0,0 +1,3 @@ | ||||
| <svg xmlns="http://www.w3.org/2000/svg" width="25.974" height="24.23" viewBox="0 0 25.974 24.23"> | ||||
|   <path id="shipping_2_" data-name="shipping (2)" d="M23.959,29.714V17.886a.764.764,0,0,0-.764-.764H2.724a.764.764,0,0,0-.764.764V30.657A2.294,2.294,0,0,0,.512,34.381l3.442,4.172c2.13,2.493,4.393,2.8,7.758,2.8a25.054,25.054,0,0,0,6.694-.561l2.45-.586a2.138,2.138,0,0,0,1.737.914H23.8a2.238,2.238,0,0,0,2.175-2.291V32A2.248,2.248,0,0,0,23.959,29.714Zm-3.434,1.572-1.018-.517a6.053,6.053,0,0,0-5.309-.086,7.3,7.3,0,0,1-2,.774H8.664a2.128,2.128,0,0,0-2.125,2.125v.557l-.02-.021L4,31.381a2.327,2.327,0,0,0-.508-.416v-7.58H9.741v2.8a.764.764,0,0,0,.764.764h4.821a.764.764,0,0,0,.764-.764v-2.8h6.341v6.329A2.2,2.2,0,0,0,20.525,31.286Zm-9.256-7.9h3.293v2.037H11.269Zm11.162-1.528H16.091V18.65h6.341v3.206ZM14.563,18.65v3.206H11.269V18.65Zm-4.821,0v3.206H3.488V18.65ZM18.05,39.3a24.308,24.308,0,0,1-6.312.511c-3.158,0-4.684-.051-6.606-2.235L1.691,33.408a.773.773,0,0,1,1.182-.993L5.4,35.154a3.469,3.469,0,0,0,2.54,1.113h6.994a.764.764,0,0,0,0-1.528H8.067V33.582a.6.6,0,0,1,.6-.6H12.2a6.994,6.994,0,0,0,2.645-.917,4.533,4.533,0,0,1,3.975.063l1.6.813v5.794Zm6.4-.477a.713.713,0,0,1-.647.763H22.592a.713.713,0,0,1-.647-.763V32a.713.713,0,0,1,.647-.763H23.8a.713.713,0,0,1,.647.763Z" transform="translate(0.001 -17.122)" fill="#989898"/> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 1.3 KiB | 
											
												Binary file not shown.
											
										
									
								| After Width: | Height: | Size: 18 KiB | 
											
												Binary file not shown.
											
										
									
								| After Width: | Height: | Size: 19 KiB | 
| @ -0,0 +1,15 @@ | ||||
| <svg xmlns="http://www.w3.org/2000/svg" width="21.12" height="26.881" viewBox="0 0 21.12 26.881"> | ||||
|   <g id="clipboard_5_" data-name="clipboard (5)" transform="translate(-47.037 0)"> | ||||
|     <g id="Group_7687" data-name="Group 7687" transform="translate(47.037 0)"> | ||||
|       <g id="Group_7686" data-name="Group 7686" transform="translate(0 0)"> | ||||
|         <path id="Path_4672" data-name="Path 4672" d="M65.469,3.522H63.037V2.434c0-.352-.384-.512-.736-.512H60.413A2.862,2.862,0,0,0,57.565,0a2.912,2.912,0,0,0-2.848,1.92H52.861c-.352,0-.7.16-.7.512V3.522H49.725a2.72,2.72,0,0,0-2.688,2.592V24.45a2.575,2.575,0,0,0,2.688,2.432H65.469a2.575,2.575,0,0,0,2.688-2.432V6.114A2.72,2.72,0,0,0,65.469,3.522ZM53.437,3.2H55.2a.7.7,0,0,0,.608-.576,1.856,1.856,0,0,1,1.76-1.44,1.824,1.824,0,0,1,1.728,1.44.7.7,0,0,0,.64.576h1.824v2.56h-8.32ZM66.877,24.45A1.3,1.3,0,0,1,65.469,25.6H49.725a1.3,1.3,0,0,1-1.408-1.152V6.114A1.44,1.44,0,0,1,49.725,4.8h2.432V6.434a.672.672,0,0,0,.7.608H62.3a.7.7,0,0,0,.736-.608V4.8h2.432a1.44,1.44,0,0,1,1.408,1.312V24.45Z" transform="translate(-47.037 0)" fill="#989898"/> | ||||
|         <path id="Path_4673" data-name="Path 4673" d="M104.271,230.511a.64.64,0,0,0-.9-.032l-2.048,1.952-.864-.9a.64.64,0,0,0-.9-.032.672.672,0,0,0,0,.928l1.312,1.344a.576.576,0,0,0,.448.192.64.64,0,0,0,.448-.192l2.5-2.368a.608.608,0,0,0,.037-.859C104.3,230.535,104.283,230.523,104.271,230.511Z" transform="translate(-96.175 -216.205)" fill="#989898"/> | ||||
|         <path id="Path_4674" data-name="Path 4674" d="M206.548,256.034h-7.36a.64.64,0,0,0,0,1.28h7.36a.64.64,0,1,0,0-1.28Z" transform="translate(-189.268 -240.352)" fill="#989898"/> | ||||
|         <path id="Path_4675" data-name="Path 4675" d="M104.271,146.919a.64.64,0,0,0-.9-.032l-2.048,1.952-.864-.9a.64.64,0,0,0-.9-.032.672.672,0,0,0,0,.928l1.312,1.344a.576.576,0,0,0,.448.192.64.64,0,0,0,.448-.192l2.5-2.368a.608.608,0,0,0,.037-.859C104.3,146.943,104.283,146.931,104.271,146.919Z" transform="translate(-96.175 -137.733)" fill="#989898"/> | ||||
|         <path id="Path_4676" data-name="Path 4676" d="M206.548,172.442h-7.36a.64.64,0,0,0,0,1.28h7.36a.64.64,0,1,0,0-1.28Z" transform="translate(-189.268 -161.88)" fill="#989898"/> | ||||
|         <path id="Path_4677" data-name="Path 4677" d="M104.271,314.1a.64.64,0,0,0-.9-.032l-2.048,1.952-.864-.9a.64.64,0,0,0-.9-.032.672.672,0,0,0,0,.928l1.312,1.344a.576.576,0,0,0,.448.192.64.64,0,0,0,.448-.192l2.5-2.368a.608.608,0,0,0,.037-.859C104.3,314.126,104.283,314.114,104.271,314.1Z" transform="translate(-96.175 -294.677)" fill="#989898"/> | ||||
|         <path id="Path_4678" data-name="Path 4678" d="M206.548,339.626h-7.36a.64.64,0,0,0,0,1.28h7.36a.64.64,0,1,0,0-1.28Z" transform="translate(-189.268 -318.824)" fill="#989898"/> | ||||
|       </g> | ||||
|     </g> | ||||
|   </g> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 2.6 KiB | 
| @ -0,0 +1,30 @@ | ||||
| import 'package:permission_handler/permission_handler.dart'; | ||||
| 
 | ||||
| class AppPermissions{ | ||||
|   static location(Function(bool) completion) { | ||||
|     Permission.location.isGranted.then((isGranted){ | ||||
|       if(!isGranted){ | ||||
|         Permission.location.request().then((granted){ | ||||
|           completion(granted == PermissionStatus.granted); | ||||
|         }); | ||||
|       } | ||||
|       completion(isGranted); | ||||
|     }); | ||||
| 
 | ||||
|   } | ||||
| 
 | ||||
|   static checkAll(Function(bool) completion){ | ||||
|     [ | ||||
|       Permission.location | ||||
|     ].request().then((value){ | ||||
| 
 | ||||
|       bool allGranted = false; | ||||
|       value.values.forEach((element) { | ||||
|         allGranted = allGranted && element == PermissionStatus.granted; | ||||
|       }); | ||||
| 
 | ||||
|       completion(allGranted); | ||||
| 
 | ||||
|     }); | ||||
|   } | ||||
| } | ||||
| @ -0,0 +1,249 @@ | ||||
| import 'dart:async'; | ||||
| import 'dart:math'; | ||||
| import 'dart:ui'; | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:flutter/rendering.dart'; | ||||
| import 'package:geolocator/geolocator.dart'; | ||||
| import 'package:google_directions_api/google_directions_api.dart'; | ||||
| import 'package:google_maps_flutter/google_maps_flutter.dart'; | ||||
| import 'package:mohem_flutter_app/classes/utils.dart'; | ||||
| // import 'package:geodesy/geodesy.dart' as geodesy; | ||||
| 
 | ||||
| import '../../classes/app_permissions.dart'; | ||||
| import '../../theme/colors.dart'; | ||||
| 
 | ||||
| 
 | ||||
| //Created By Mr.Zohaib | ||||
| class Location { | ||||
|   static _Map map = _Map(); | ||||
| 
 | ||||
|   static havePermission(Function(bool) callback) { | ||||
|     Geolocator.checkPermission().then((value) async { | ||||
|       if (value == LocationPermission.denied) { | ||||
|         value = await Geolocator.requestPermission(); | ||||
|         callback(![LocationPermission.denied, LocationPermission.deniedForever].contains(value)); | ||||
|       } else { | ||||
|         callback(true); | ||||
|       } | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   static isEnabled(Function(bool) callback) { | ||||
|     Geolocator.isLocationServiceEnabled().then((value) => callback(value)); | ||||
|   } | ||||
| 
 | ||||
|   static bool _listeningSettingChange = true; | ||||
| 
 | ||||
|   static listenGPS({bool change = true, Function(bool)? onChange}) async { | ||||
|     _listeningSettingChange = change; | ||||
|     if (change == false) return; | ||||
| 
 | ||||
|     Future.doWhile(() async { | ||||
|       await Utils.delay(1000); | ||||
|       var enable = await Geolocator.isLocationServiceEnabled(); | ||||
|       onChange!(enable); | ||||
|       return _listeningSettingChange; | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   static getCurrentLocation(Function(LatLng?) callback) { | ||||
|     done(Position position) { | ||||
|       //AppStorage.sp.saveLocation(position); | ||||
| 
 | ||||
|       LatLng? myCurrentLocation = LatLng(position.latitude, position.longitude); | ||||
|       callback(myCurrentLocation); | ||||
|     } | ||||
| 
 | ||||
|     AppPermissions.location((granted) { | ||||
| 
 | ||||
|       if (granted) | ||||
|         Geolocator.getLastKnownPosition(forceAndroidLocationManager: true).then((value) { | ||||
|           if (value == null) { | ||||
|             Geolocator.getCurrentPosition().then((value) { | ||||
|               done(value); | ||||
|             }); | ||||
|           } else { | ||||
|             done(value); | ||||
|           } | ||||
|         }); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   // static LatLng locationAwayFrom( | ||||
|   //     {required LatLng loc1, num distanceMeters = 200.0, num bearing = 270.0}) { | ||||
|   //   geodesy.LatLng l1 = geodesy.LatLng(loc1.latitude, loc1.longitude); | ||||
|   //   geodesy.LatLng destinationPoint = geodesy.Geodesy() | ||||
|   //       .destinationPointByDistanceAndBearing(l1, distanceMeters, bearing); | ||||
|   //   return LatLng(destinationPoint.latitude, destinationPoint.longitude); | ||||
|   // } | ||||
| 
 | ||||
|   static Future<double> distanceTo(LatLng destination) async { | ||||
|     var myLoc = await Geolocator.getLastKnownPosition(); | ||||
|     var distance = 0.0; | ||||
|     if (myLoc != null) { | ||||
|       distance = Geolocator.distanceBetween(destination.latitude, destination.longitude, myLoc.latitude, myLoc.longitude); | ||||
|     } | ||||
|     return distance; | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| class _Map { | ||||
|   Marker createMarker( | ||||
|     String id, { | ||||
|     required LatLng coordinates, | ||||
|     BitmapDescriptor? icon, | ||||
|     VoidCallback? onTap, | ||||
|   }) { | ||||
|     final MarkerId markerId = MarkerId(id); | ||||
|     return Marker( | ||||
|       icon: icon ?? BitmapDescriptor.defaultMarker, | ||||
|       markerId: markerId, | ||||
|       position: coordinates, | ||||
|       flat: false, | ||||
|       // infoWindow: InfoWindow(title: id, snippet: '*'), | ||||
|       onTap: onTap, | ||||
|     ); | ||||
|   } | ||||
| 
 | ||||
|   CameraPosition initialCamera({required Completer<GoogleMapController> mapController, LatLng? position, double zoom = 12}) { | ||||
|     position = position ?? LatLng(24.7249303, 46.5416656); | ||||
|     CameraPosition riyadhEye = CameraPosition( | ||||
|       target: position, | ||||
|       zoom: zoom, | ||||
|     ); | ||||
|     mapController.future.then((controller) { | ||||
|       controller.animateCamera(CameraUpdate.newCameraPosition(riyadhEye)); | ||||
|     }); | ||||
|     return riyadhEye; | ||||
|   } | ||||
| 
 | ||||
|   CameraPosition moveTo(LatLng location, {double zoom = 12, double direction = 0.0, required Completer<GoogleMapController> mapController, bool? animation}) { | ||||
|     var camera = CameraPosition(target: location, zoom: zoom, bearing: direction); | ||||
|     mapController.future.then((controller) { | ||||
|       animation ?? false ? controller.animateCamera(CameraUpdate.newCameraPosition(camera)) : controller.moveCamera(CameraUpdate.newCameraPosition(camera)); | ||||
|     }); | ||||
|     return camera; | ||||
|   } | ||||
| 
 | ||||
|   moveCamera(CameraPosition camera, @required Completer<GoogleMapController> mapController, bool animation) { | ||||
|     mapController.future.then((controller) { | ||||
|       animation ? controller.animateCamera(CameraUpdate.newCameraPosition(camera)) : controller.moveCamera(CameraUpdate.newCameraPosition(camera)); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   scrollBy({double x = 0, double y = 0, required Completer<GoogleMapController> mapController, bool animation = true}) { | ||||
|     var camera = CameraUpdate.scrollBy(x, y); | ||||
|     mapController.future.then((controller) { | ||||
|       animation ? controller.animateCamera(camera) : controller.moveCamera(camera); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   goToCurrentLocation({Completer<GoogleMapController>? mapController, double? direction = 0.0, bool? animation}) { | ||||
|     Location.getCurrentLocation((location) { | ||||
|       moveTo(location!, zoom: 17, mapController: mapController!, animation: animation, direction: direction!); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   var routes = Map<String, DirectionsRoute>(); | ||||
| 
 | ||||
|   setRoutePolylines(LatLng? source, LatLng? destination, Set<Polyline> polylines, Completer<GoogleMapController> mapController, Function(DirectionsRoute?) completion) { | ||||
|     if (source == null || destination == null) { | ||||
|       completion(null); | ||||
|       return; | ||||
|     } | ||||
| 
 | ||||
|     var origin = '${source.latitude},${source.longitude}'; | ||||
|     var destin = '${destination.latitude},${destination.longitude}'; | ||||
|     var routeId = '$origin->$destination'; | ||||
| 
 | ||||
|     createPolyline(DirectionsRoute results) { | ||||
|       List<LatLng> polylineCoordinates = results.overviewPath!.map((e) => LatLng(e.latitude, e.longitude)).toList(); | ||||
|       PolylineId id = PolylineId("route"); | ||||
|       Polyline polyline = Polyline( | ||||
|         polylineId: id, | ||||
|         color: accentColor, | ||||
|         width: 5, | ||||
|         jointType: JointType.round, | ||||
|         startCap: Cap.roundCap, | ||||
|         endCap: Cap.roundCap, | ||||
|         points: polylineCoordinates, | ||||
|       ); | ||||
| 
 | ||||
|       polylines.removeWhere((element) => true); | ||||
|       polylines.add(polyline); | ||||
| 
 | ||||
|       LatLngBounds bound = getBounds(coordinates: polylineCoordinates); | ||||
|       focusCameraToLatLngBounds(bound: bound, mapController: mapController, padding: 100); | ||||
|       completion(routes[routeId]); | ||||
|     } | ||||
| 
 | ||||
|     var availableRoute = routes[routeId]; | ||||
|     if (availableRoute == null) { | ||||
|       var request = DirectionsRequest(origin: origin, destination: destin); | ||||
|       DirectionsService().route(request, (response, status) { | ||||
|         if (status == DirectionsStatus.ok && response.routes!.isNotEmpty) { | ||||
|           routes[routeId] = response.routes!.first; | ||||
|           createPolyline(response.routes!.first); | ||||
|         } | ||||
|       }); | ||||
|     } else { | ||||
|       createPolyline(availableRoute); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   LatLngBounds getBounds({required List<LatLng> coordinates}) { | ||||
|     var lngs = coordinates.map<double>((c) => c.longitude).toList(); | ||||
|     var lats = coordinates.map<double>((c) => c.latitude).toList(); | ||||
| 
 | ||||
|     double bottomMost = lngs.reduce(min); | ||||
|     double topMost = lngs.reduce(max); | ||||
|     double leftMost = lats.reduce(min); | ||||
|     double rightMost = lats.reduce(max); | ||||
| 
 | ||||
|     LatLngBounds bounds = LatLngBounds( | ||||
|       northeast: LatLng(rightMost, topMost), | ||||
|       southwest: LatLng(leftMost, bottomMost), | ||||
|     ); | ||||
|     return bounds; | ||||
| 
 | ||||
|     double? x0, x1, y0, y1; | ||||
|     for (LatLng latLng in coordinates) { | ||||
|       if (x0 == null) { | ||||
|         x0 = x1 = latLng.latitude; | ||||
|         y0 = y1 = latLng.longitude; | ||||
|       } else { | ||||
|         if (latLng.latitude > x1!) x1 = latLng.latitude; | ||||
|         if (latLng.latitude < x0) x0 = latLng.latitude; | ||||
|         if (latLng.longitude > y1!) y1 = latLng.longitude; | ||||
|         if (latLng.longitude < y0!) y0 = latLng.longitude; | ||||
|       } | ||||
|     } | ||||
|     return LatLngBounds(northeast: LatLng(x1!, y1!), southwest: LatLng(x0!, y0!)); | ||||
|   } | ||||
| 
 | ||||
|   focusCameraToLatLngBounds({LatLngBounds? bound, Completer<GoogleMapController>? mapController, double? padding}) async { | ||||
|     if (bound == null) return; | ||||
| 
 | ||||
|     CameraUpdate camera = CameraUpdate.newLatLngBounds(bound, padding!); | ||||
|     final GoogleMapController controller = await mapController!.future; | ||||
|     controller.animateCamera(camera); | ||||
|   } | ||||
| 
 | ||||
|   focusCameraTo2Points({LatLng? point1, LatLng? point2, Completer<GoogleMapController>? mapController, double? padding}) async { | ||||
|     var source = point1; | ||||
|     var destination = point2; | ||||
|     if (source != null && destination != null) { | ||||
|       // 'package:google_maps_flutter_platform_interface/src/types/location.dart': Failed assertion: line 72 pos 16: 'southwest.latitude <= northeast.latitude': is not true. | ||||
|       LatLngBounds bound; | ||||
|       if (source.latitude <= destination.latitude) { | ||||
|         bound = LatLngBounds(southwest: source, northeast: destination); | ||||
|       } else { | ||||
|         bound = LatLngBounds(southwest: destination, northeast: source); | ||||
|       } | ||||
| 
 | ||||
|       if (bound == null) return; | ||||
| 
 | ||||
|       focusCameraToLatLngBounds(bound: bound, mapController: mapController, padding: padding); | ||||
|     } | ||||
|   } | ||||
| } | ||||
| @ -0,0 +1,187 @@ | ||||
| import 'dart:async'; | ||||
| 
 | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:nfc_manager/nfc_manager.dart'; | ||||
| import 'package:nfc_manager/platform_tags.dart'; | ||||
| 
 | ||||
| void showNfcReader(BuildContext context, {required Function(String? nfcId) onNcfScan}) { | ||||
|   showModalBottomSheet( | ||||
|     context: context, | ||||
|     enableDrag: false, | ||||
|     isDismissible: false, | ||||
|     shape: RoundedRectangleBorder( | ||||
|       borderRadius: BorderRadius.only(topLeft: Radius.circular(12), topRight: Radius.circular(12)), | ||||
|     ), | ||||
|     backgroundColor: Colors.white, | ||||
|     builder: (context) { | ||||
|       return NfcLayout( | ||||
|         onNcfScan: onNcfScan, | ||||
|       ); | ||||
|     }, | ||||
|   ); | ||||
| } | ||||
| 
 | ||||
| class NfcLayout extends StatefulWidget { | ||||
|   Function(String? nfcId) onNcfScan; | ||||
| 
 | ||||
|   NfcLayout({required this.onNcfScan}); | ||||
| 
 | ||||
|   @override | ||||
|   _NfcLayoutState createState() => _NfcLayoutState(); | ||||
| } | ||||
| 
 | ||||
| class _NfcLayoutState extends State<NfcLayout> { | ||||
|   bool _reading = false; | ||||
|   Widget? mainWidget; | ||||
|   String? nfcId; | ||||
| 
 | ||||
|   @override | ||||
|   void initState() { | ||||
|     super.initState(); | ||||
| 
 | ||||
|     NfcManager.instance.startSession(onDiscovered: (NfcTag tag) async { | ||||
|       print(tag.data); | ||||
|       var f = MifareUltralight(tag: tag, identifier: tag.data["nfca"]["identifier"], type: 2, maxTransceiveLength: 252, timeout: 22); | ||||
|       final String identifier = f.identifier.map((e) => e.toRadixString(16).padLeft(2, '0')).join(''); | ||||
|       // print(identifier); // => 0428fcf2255e81 | ||||
|       nfcId = identifier; | ||||
| 
 | ||||
|       setState(() { | ||||
|         _reading = true; | ||||
|         mainWidget = doneNfc(); | ||||
|       }); | ||||
| 
 | ||||
|       Future.delayed(const Duration(seconds: 1), () { | ||||
|         NfcManager.instance.stopSession(); | ||||
|         Navigator.pop(context); | ||||
|         widget.onNcfScan(nfcId); | ||||
|       }); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     (mainWidget == null && !_reading) ? mainWidget = scanNfc() : mainWidget = doneNfc(); | ||||
|     return AnimatedSwitcher(duration: Duration(milliseconds: 500), child: mainWidget); | ||||
|   } | ||||
| 
 | ||||
|   Widget scanNfc() { | ||||
|     return Container( | ||||
|       key: ValueKey(1), | ||||
|       child: Column( | ||||
|         mainAxisSize: MainAxisSize.min, | ||||
|         children: <Widget>[ | ||||
|           SizedBox( | ||||
|             height: 30, | ||||
|           ), | ||||
|           Text( | ||||
|             "Ready To Scan", | ||||
|             style: TextStyle( | ||||
|               fontWeight: FontWeight.bold, | ||||
|               fontSize: 24, | ||||
|             ), | ||||
|           ), | ||||
|           SizedBox( | ||||
|             height: 30, | ||||
|           ), | ||||
|           Image.asset( | ||||
|             "assets/icons/nfc/ic_nfc.png", | ||||
|             height: MediaQuery.of(context).size.width / 3, | ||||
|           ), | ||||
|           SizedBox( | ||||
|             height: 30, | ||||
|           ), | ||||
|           Text( | ||||
|             "Approach an NFC Tag", | ||||
|             style: TextStyle( | ||||
|               fontSize: 18, | ||||
|             ), | ||||
|           ), | ||||
|           SizedBox( | ||||
|             height: 30, | ||||
|           ), | ||||
|           ButtonTheme( | ||||
|             minWidth: MediaQuery.of(context).size.width / 1.2, | ||||
|             height: 45.0, | ||||
|             buttonColor: Colors.grey[300], | ||||
|             shape: RoundedRectangleBorder( | ||||
|               borderRadius: BorderRadius.circular(6), | ||||
|             ), | ||||
|             child: RaisedButton( | ||||
|               onPressed: () { | ||||
|                 NfcManager.instance.stopSession(); | ||||
|                 Navigator.pop(context); | ||||
|               }, | ||||
|               elevation: 0, | ||||
|               child: Text("CANCEL"), | ||||
|             ), | ||||
|           ), | ||||
|           SizedBox( | ||||
|             height: 30, | ||||
|           ), | ||||
|         ], | ||||
|       ), | ||||
|     ); | ||||
|   } | ||||
| 
 | ||||
|   Widget doneNfc() { | ||||
|     return Container( | ||||
|       key: ValueKey(2), | ||||
|       child: Column( | ||||
|         mainAxisSize: MainAxisSize.min, | ||||
|         children: <Widget>[ | ||||
|           SizedBox( | ||||
|             height: 30, | ||||
|           ), | ||||
|           Text( | ||||
|             "Successfully Scanned", | ||||
|             style: TextStyle( | ||||
|               fontWeight: FontWeight.bold, | ||||
|               fontSize: 24, | ||||
|             ), | ||||
|           ), | ||||
|           SizedBox( | ||||
|             height: 30, | ||||
|           ), | ||||
|           Image.asset( | ||||
|             "assets/icons/nfc/ic_done.png", | ||||
|             height: MediaQuery.of(context).size.width / 3, | ||||
|           ), | ||||
|           SizedBox( | ||||
|             height: 30, | ||||
|           ), | ||||
|           Text( | ||||
|             "Approach an NFC Tag", | ||||
|             style: TextStyle( | ||||
|               fontSize: 18, | ||||
|             ), | ||||
|           ), | ||||
|           SizedBox( | ||||
|             height: 30, | ||||
|           ), | ||||
|           ButtonTheme( | ||||
|             minWidth: MediaQuery.of(context).size.width / 1.2, | ||||
|             height: 45.0, | ||||
|             buttonColor: Colors.grey[300], | ||||
|             shape: RoundedRectangleBorder( | ||||
|               borderRadius: BorderRadius.circular(6), | ||||
|             ), | ||||
|             child: RaisedButton( | ||||
|               // onPressed: () { | ||||
|               //   _stream?.cancel(); | ||||
|               //   widget.onNcfScan(nfcId); | ||||
|               //   Navigator.pop(context); | ||||
|               // }, | ||||
|               onPressed: null, | ||||
|               elevation: 0, | ||||
|               child: Text("DONE"), | ||||
|             ), | ||||
|           ), | ||||
|           SizedBox( | ||||
|             height: 30, | ||||
|           ), | ||||
|         ], | ||||
|       ), | ||||
|     ); | ||||
|   } | ||||
| } | ||||
| @ -0,0 +1,194 @@ | ||||
| // import 'dart:async'; | ||||
| // | ||||
| // import 'package:flutter/material.dart'; | ||||
| // | ||||
| // | ||||
| // void showNfcReader(BuildContext context, {Function onNcfScan}) { | ||||
| //   showModalBottomSheet( | ||||
| //       context: context, | ||||
| //       enableDrag: false, | ||||
| //       isDismissible: false, | ||||
| //       shape: RoundedRectangleBorder( | ||||
| //         borderRadius: BorderRadius.only(topLeft: Radius.circular(12), topRight: Radius.circular(12)), | ||||
| //       ), | ||||
| //       backgroundColor: Colors.white, | ||||
| //       builder: (context) { | ||||
| //         return NfcLayout( | ||||
| //           onNcfScan: onNcfScan, | ||||
| //         ); | ||||
| //       }); | ||||
| // } | ||||
| // | ||||
| // class NfcLayout extends StatefulWidget { | ||||
| //   Function onNcfScan; | ||||
| // | ||||
| //   NfcLayout({this.onNcfScan}); | ||||
| // | ||||
| //   @override | ||||
| //   _NfcLayoutState createState() => _NfcLayoutState(); | ||||
| // } | ||||
| // | ||||
| // class _NfcLayoutState extends State<NfcLayout> { | ||||
| //   StreamSubscription<NDEFMessage> _stream; | ||||
| //   bool _reading = false; | ||||
| //   Widget mainWidget; | ||||
| //   String nfcId; | ||||
| // | ||||
| //   @override | ||||
| //   void initState() { | ||||
| //     super.initState(); | ||||
| // | ||||
| //     setState(() { | ||||
| //       // _reading = true; | ||||
| //       // Start reading using NFC.readNDEF() | ||||
| //       _stream = NFC.readNDEF(once: false, throwOnUserCancel: false, readerMode: NFCDispatchReaderMode()).listen((NDEFMessage message) { | ||||
| //         setState(() { | ||||
| //           _reading = true; | ||||
| //           mainWidget = doneNfc(); | ||||
| //         }); | ||||
| //         Future.delayed(const Duration(milliseconds: 500), () { | ||||
| //           _stream?.cancel(); | ||||
| //           widget.onNcfScan(nfcId); | ||||
| //           Navigator.pop(context); | ||||
| //         }); | ||||
| //         print("read NDEF id: ${message.id}"); | ||||
| //         print("NFC Record " + message.payload); | ||||
| //         print("NFC Record Lenght " + message.records.length.toString()); | ||||
| //         print("NFC Record " + message.records.first.id); | ||||
| //         print("NFC Record " + message.records.first.payload); | ||||
| //         print("NFC Record " + message.records.first.data); | ||||
| //         print("NFC Record " + message.records.first.type); | ||||
| //         //  widget.onNcfScan(message.id); | ||||
| //         nfcId = message.id; | ||||
| //       }, onError: (e) { | ||||
| //         // Check error handling guide below | ||||
| //       }); | ||||
| //     }); | ||||
| //   } | ||||
| // | ||||
| //   @override | ||||
| //   Widget build(BuildContext context) { | ||||
| //     (mainWidget == null && !_reading) ? mainWidget = scanNfc() : mainWidget = doneNfc(); | ||||
| //     return AnimatedSwitcher(duration: Duration(milliseconds: 500), child: mainWidget); | ||||
| //   } | ||||
| // | ||||
| //   Widget scanNfc() { | ||||
| //     return Container( | ||||
| //       key: ValueKey(1), | ||||
| //       child: Column( | ||||
| //         mainAxisSize: MainAxisSize.min, | ||||
| //         children: <Widget>[ | ||||
| //           SizedBox( | ||||
| //             height: 30, | ||||
| //           ), | ||||
| //           Text( | ||||
| //             "Ready To Scan", | ||||
| //             style: TextStyle( | ||||
| //               fontWeight: FontWeight.bold, | ||||
| //               fontSize: 24, | ||||
| //             ), | ||||
| //           ), | ||||
| //           SizedBox( | ||||
| //             height: 30, | ||||
| //           ), | ||||
| //           Image.asset( | ||||
| //             "assets/images/nfc/ic_nfc.png", | ||||
| //             height: MediaQuery.of(context).size.width / 3, | ||||
| //           ), | ||||
| //           SizedBox( | ||||
| //             height: 30, | ||||
| //           ), | ||||
| //           Text( | ||||
| //             "Approach an NFC Tag", | ||||
| //             style: TextStyle( | ||||
| //               fontSize: 18, | ||||
| //             ), | ||||
| //           ), | ||||
| //           SizedBox( | ||||
| //             height: 30, | ||||
| //           ), | ||||
| //           ButtonTheme( | ||||
| //             minWidth: MediaQuery.of(context).size.width / 1.2, | ||||
| //             height: 45.0, | ||||
| //             buttonColor: Colors.grey[300], | ||||
| //             shape: RoundedRectangleBorder( | ||||
| //               borderRadius: BorderRadius.circular(6), | ||||
| //             ), | ||||
| //             child: RaisedButton( | ||||
| //               onPressed: () { | ||||
| //                 _stream?.cancel(); | ||||
| //                 Navigator.pop(context); | ||||
| //               }, | ||||
| //               elevation: 0, | ||||
| //               child: Text("CANCEL"), | ||||
| //             ), | ||||
| //           ), | ||||
| //           SizedBox( | ||||
| //             height: 30, | ||||
| //           ), | ||||
| //         ], | ||||
| //       ), | ||||
| //     ); | ||||
| //   } | ||||
| // | ||||
| //   Widget doneNfc() { | ||||
| //     return Container( | ||||
| //       key: ValueKey(2), | ||||
| //       child: Column( | ||||
| //         mainAxisSize: MainAxisSize.min, | ||||
| //         children: <Widget>[ | ||||
| //           SizedBox( | ||||
| //             height: 30, | ||||
| //           ), | ||||
| //           Text( | ||||
| //             "Successfully Scanned", | ||||
| //             style: TextStyle( | ||||
| //               fontWeight: FontWeight.bold, | ||||
| //               fontSize: 24, | ||||
| //             ), | ||||
| //           ), | ||||
| //           SizedBox( | ||||
| //             height: 30, | ||||
| //           ), | ||||
| //           Image.asset( | ||||
| //             "assets/images/nfc/ic_done.png", | ||||
| //             height: MediaQuery.of(context).size.width / 3, | ||||
| //           ), | ||||
| //           SizedBox( | ||||
| //             height: 30, | ||||
| //           ), | ||||
| //           Text( | ||||
| //             "Approach an NFC Tag", | ||||
| //             style: TextStyle( | ||||
| //               fontSize: 18, | ||||
| //             ), | ||||
| //           ), | ||||
| //           SizedBox( | ||||
| //             height: 30, | ||||
| //           ), | ||||
| //           ButtonTheme( | ||||
| //             minWidth: MediaQuery.of(context).size.width / 1.2, | ||||
| //             height: 45.0, | ||||
| //             buttonColor: Colors.grey[300], | ||||
| //             shape: RoundedRectangleBorder( | ||||
| //               borderRadius: BorderRadius.circular(6), | ||||
| //             ), | ||||
| //             child: RaisedButton( | ||||
| //               // onPressed: () { | ||||
| //               //   _stream?.cancel(); | ||||
| //               //   widget.onNcfScan(nfcId); | ||||
| //               //   Navigator.pop(context); | ||||
| //               // }, | ||||
| //               onPressed: null, | ||||
| //               elevation: 0, | ||||
| //               child: Text("DONE"), | ||||
| //             ), | ||||
| //           ), | ||||
| //           SizedBox( | ||||
| //             height: 30, | ||||
| //           ), | ||||
| //         ], | ||||
| //       ), | ||||
| //     ); | ||||
| //   } | ||||
| // } | ||||
| @ -1,514 +0,0 @@ | ||||
| # Generated by pub | ||||
| # See https://dart.dev/tools/pub/glossary#lockfile | ||||
| packages: | ||||
|   args: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: args | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "2.3.0" | ||||
|   async: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: async | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "2.8.2" | ||||
|   boolean_selector: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: boolean_selector | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "2.1.0" | ||||
|   characters: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: characters | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "1.2.0" | ||||
|   charcode: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: charcode | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "1.3.1" | ||||
|   clock: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: clock | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "1.1.0" | ||||
|   collection: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: collection | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "1.15.0" | ||||
|   crypto: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: crypto | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "3.0.1" | ||||
|   cupertino_icons: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: cupertino_icons | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "1.0.4" | ||||
|   easy_localization: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: easy_localization | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "3.0.0" | ||||
|   easy_logger: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: easy_logger | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "0.0.2" | ||||
|   fake_async: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: fake_async | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "1.2.0" | ||||
|   ffi: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: ffi | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "1.1.2" | ||||
|   file: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: file | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "6.1.2" | ||||
|   flutter: | ||||
|     dependency: "direct main" | ||||
|     description: flutter | ||||
|     source: sdk | ||||
|     version: "0.0.0" | ||||
|   flutter_countdown_timer: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: flutter_countdown_timer | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "4.1.0" | ||||
|   flutter_lints: | ||||
|     dependency: "direct dev" | ||||
|     description: | ||||
|       name: flutter_lints | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "1.0.4" | ||||
|   flutter_localizations: | ||||
|     dependency: transitive | ||||
|     description: flutter | ||||
|     source: sdk | ||||
|     version: "0.0.0" | ||||
|   flutter_plugin_android_lifecycle: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: flutter_plugin_android_lifecycle | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "2.0.5" | ||||
|   flutter_svg: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: flutter_svg | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "1.0.0" | ||||
|   flutter_test: | ||||
|     dependency: "direct dev" | ||||
|     description: flutter | ||||
|     source: sdk | ||||
|     version: "0.0.0" | ||||
|   flutter_web_plugins: | ||||
|     dependency: transitive | ||||
|     description: flutter | ||||
|     source: sdk | ||||
|     version: "0.0.0" | ||||
|   fluttertoast: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: fluttertoast | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "8.0.8" | ||||
|   http: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: http | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "0.13.4" | ||||
|   http_parser: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: http_parser | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "4.0.0" | ||||
|   injector: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: injector | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "2.0.0" | ||||
|   intl: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: intl | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "0.17.0" | ||||
|   js: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: js | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "0.6.3" | ||||
|   lints: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: lints | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "1.0.1" | ||||
|   local_auth: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: local_auth | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "1.1.9" | ||||
|   logger: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: logger | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "1.1.0" | ||||
|   matcher: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: matcher | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "0.12.11" | ||||
|   meta: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: meta | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "1.7.0" | ||||
|   nested: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: nested | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "1.0.0" | ||||
|   path: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: path | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "1.8.0" | ||||
|   path_drawing: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: path_drawing | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "1.0.0" | ||||
|   path_parsing: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: path_parsing | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "1.0.0" | ||||
|   path_provider: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: path_provider | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "2.0.8" | ||||
|   path_provider_android: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: path_provider_android | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "2.0.9" | ||||
|   path_provider_ios: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: path_provider_ios | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "2.0.7" | ||||
|   path_provider_linux: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: path_provider_linux | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "2.1.4" | ||||
|   path_provider_macos: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: path_provider_macos | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "2.0.4" | ||||
|   path_provider_platform_interface: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: path_provider_platform_interface | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "2.0.1" | ||||
|   path_provider_windows: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: path_provider_windows | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "2.0.4" | ||||
|   permission_handler: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: permission_handler | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "8.3.0" | ||||
|   permission_handler_platform_interface: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: permission_handler_platform_interface | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "3.7.0" | ||||
|   petitparser: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: petitparser | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "4.4.0" | ||||
|   platform: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: platform | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "3.1.0" | ||||
|   plugin_platform_interface: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: plugin_platform_interface | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "2.0.2" | ||||
|   process: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: process | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "4.2.4" | ||||
|   provider: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: provider | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "6.0.1" | ||||
|   shared_preferences: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: shared_preferences | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "2.0.11" | ||||
|   shared_preferences_android: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: shared_preferences_android | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "2.0.9" | ||||
|   shared_preferences_ios: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: shared_preferences_ios | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "2.0.8" | ||||
|   shared_preferences_linux: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: shared_preferences_linux | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "2.0.3" | ||||
|   shared_preferences_macos: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: shared_preferences_macos | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "2.0.2" | ||||
|   shared_preferences_platform_interface: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: shared_preferences_platform_interface | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "2.0.0" | ||||
|   shared_preferences_web: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: shared_preferences_web | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "2.0.2" | ||||
|   shared_preferences_windows: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: shared_preferences_windows | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "2.0.3" | ||||
|   shimmer: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: shimmer | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "2.0.0" | ||||
|   sizer: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: sizer | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "2.0.15" | ||||
|   sky_engine: | ||||
|     dependency: transitive | ||||
|     description: flutter | ||||
|     source: sdk | ||||
|     version: "0.0.99" | ||||
|   source_span: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: source_span | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "1.8.1" | ||||
|   stack_trace: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: stack_trace | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "1.10.0" | ||||
|   stream_channel: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: stream_channel | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "2.1.0" | ||||
|   string_scanner: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: string_scanner | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "1.1.0" | ||||
|   term_glyph: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: term_glyph | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "1.2.0" | ||||
|   test_api: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: test_api | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "0.4.3" | ||||
|   typed_data: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: typed_data | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "1.3.0" | ||||
|   universal_io: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: universal_io | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "2.0.4" | ||||
|   vector_math: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: vector_math | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "2.1.1" | ||||
|   win32: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: win32 | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "2.3.1" | ||||
|   xdg_directories: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: xdg_directories | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "0.2.0" | ||||
|   xml: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: xml | ||||
|       url: "https://pub.dartlang.org" | ||||
|     source: hosted | ||||
|     version: "5.3.1" | ||||
| sdks: | ||||
|   dart: ">=2.14.0 <3.0.0" | ||||
|   flutter: ">=2.5.0" | ||||
					Loading…
					
					
				
		Reference in New Issue