Showing
4 changed files
with
266 additions
and
7 deletions
lib/models/nearby_response.dart
0 → 100644
| 1 | +class NearbyPlacesResponse { | ||
| 2 | + List<Results>? results; | ||
| 3 | + String? status; | ||
| 4 | + | ||
| 5 | + NearbyPlacesResponse({this.results, this.status}); | ||
| 6 | + | ||
| 7 | + NearbyPlacesResponse.fromJson(Map<String, dynamic> json) { | ||
| 8 | + if (json['results'] != null) { | ||
| 9 | + results = <Results>[]; | ||
| 10 | + json['results'].forEach((v) { | ||
| 11 | + results!.add(Results.fromJson(v)); | ||
| 12 | + }); | ||
| 13 | + } | ||
| 14 | + status = json['status']; | ||
| 15 | + } | ||
| 16 | + | ||
| 17 | + Map<String, dynamic> toJson() { | ||
| 18 | + final Map<String, dynamic> data = Map<String, dynamic>(); | ||
| 19 | + if (this.results != null) { | ||
| 20 | + data['results'] = this.results!.map((v) => v.toJson()).toList(); | ||
| 21 | + } | ||
| 22 | + data['status'] = this.status; | ||
| 23 | + return data; | ||
| 24 | + } | ||
| 25 | +} | ||
| 26 | + | ||
| 27 | +class Results { | ||
| 28 | + Geometry? geometry; | ||
| 29 | + String? icon; | ||
| 30 | + String? iconBackgroundColor; | ||
| 31 | + String? iconMaskBaseUri; | ||
| 32 | + String? name; | ||
| 33 | + List<Photos>? photos; | ||
| 34 | + String? placeId; | ||
| 35 | + String? reference; | ||
| 36 | + String? scope; | ||
| 37 | + List<String>? types; | ||
| 38 | + String? vicinity; | ||
| 39 | + String? businessStatus; | ||
| 40 | + OpeningHours? openingHours; | ||
| 41 | + PlusCode? plusCode; | ||
| 42 | + dynamic rating; | ||
| 43 | + int? userRatingsTotal; | ||
| 44 | + | ||
| 45 | + Results( | ||
| 46 | + {this.geometry, | ||
| 47 | + this.icon, | ||
| 48 | + this.iconBackgroundColor, | ||
| 49 | + this.iconMaskBaseUri, | ||
| 50 | + this.name, | ||
| 51 | + this.photos, | ||
| 52 | + this.placeId, | ||
| 53 | + this.reference, | ||
| 54 | + this.scope, | ||
| 55 | + this.types, | ||
| 56 | + this.vicinity, | ||
| 57 | + this.businessStatus, | ||
| 58 | + this.openingHours, | ||
| 59 | + this.plusCode, | ||
| 60 | + this.rating, | ||
| 61 | + this.userRatingsTotal}); | ||
| 62 | + | ||
| 63 | + Results.fromJson(Map<String, dynamic> json) { | ||
| 64 | + geometry = | ||
| 65 | + json['geometry'] != null ? Geometry.fromJson(json['geometry']) : null; | ||
| 66 | + icon = json['icon']; | ||
| 67 | + iconBackgroundColor = json['icon_background_color']; | ||
| 68 | + iconMaskBaseUri = json['icon_mask_base_uri']; | ||
| 69 | + name = json['name']; | ||
| 70 | + if (json['photos'] != null) { | ||
| 71 | + photos = <Photos>[]; | ||
| 72 | + json['photos'].forEach((v) { | ||
| 73 | + photos!.add(Photos.fromJson(v)); | ||
| 74 | + }); | ||
| 75 | + } | ||
| 76 | + placeId = json['place_id']; | ||
| 77 | + reference = json['reference']; | ||
| 78 | + scope = json['scope']; | ||
| 79 | + types = json['types'].cast<String>(); | ||
| 80 | + vicinity = json['vicinity']; | ||
| 81 | + businessStatus = json['business_status']; | ||
| 82 | + openingHours = json['opening_hours'] != null | ||
| 83 | + ? OpeningHours.fromJson(json['opening_hours']) | ||
| 84 | + : null; | ||
| 85 | + plusCode = | ||
| 86 | + json['plus_code'] != null ? PlusCode.fromJson(json['plus_code']) : null; | ||
| 87 | + rating = json['rating']; | ||
| 88 | + userRatingsTotal = json['user_ratings_total']; | ||
| 89 | + } | ||
| 90 | + | ||
| 91 | + Map<String, dynamic> toJson() { | ||
| 92 | + final Map<String, dynamic> data = Map<String, dynamic>(); | ||
| 93 | + if (this.geometry != null) { | ||
| 94 | + data['geometry'] = this.geometry!.toJson(); | ||
| 95 | + } | ||
| 96 | + data['icon'] = this.icon; | ||
| 97 | + data['icon_background_color'] = this.iconBackgroundColor; | ||
| 98 | + data['icon_mask_base_uri'] = this.iconMaskBaseUri; | ||
| 99 | + data['name'] = this.name; | ||
| 100 | + if (this.photos != null) { | ||
| 101 | + data['photos'] = this.photos!.map((v) => v.toJson()).toList(); | ||
| 102 | + } | ||
| 103 | + data['place_id'] = this.placeId; | ||
| 104 | + data['reference'] = this.reference; | ||
| 105 | + data['scope'] = this.scope; | ||
| 106 | + data['types'] = this.types; | ||
| 107 | + data['vicinity'] = this.vicinity; | ||
| 108 | + data['business_status'] = this.businessStatus; | ||
| 109 | + if (this.openingHours != null) { | ||
| 110 | + data['opening_hours'] = this.openingHours!.toJson(); | ||
| 111 | + } | ||
| 112 | + if (this.plusCode != null) { | ||
| 113 | + data['plus_code'] = this.plusCode!.toJson(); | ||
| 114 | + } | ||
| 115 | + data['rating'] = this.rating; | ||
| 116 | + data['user_ratings_total'] = this.userRatingsTotal; | ||
| 117 | + return data; | ||
| 118 | + } | ||
| 119 | +} | ||
| 120 | + | ||
| 121 | +class Geometry { | ||
| 122 | + Location? location; | ||
| 123 | + Viewport? viewport; | ||
| 124 | + | ||
| 125 | + Geometry({this.location, this.viewport}); | ||
| 126 | + | ||
| 127 | + Geometry.fromJson(Map<String, dynamic> json) { | ||
| 128 | + location = | ||
| 129 | + json['location'] != null ? Location.fromJson(json['location']) : null; | ||
| 130 | + viewport = | ||
| 131 | + json['viewport'] != null ? Viewport.fromJson(json['viewport']) : null; | ||
| 132 | + } | ||
| 133 | + | ||
| 134 | + Map<String, dynamic> toJson() { | ||
| 135 | + final Map<String, dynamic> data = Map<String, dynamic>(); | ||
| 136 | + if (this.location != null) { | ||
| 137 | + data['location'] = this.location!.toJson(); | ||
| 138 | + } | ||
| 139 | + if (this.viewport != null) { | ||
| 140 | + data['viewport'] = this.viewport!.toJson(); | ||
| 141 | + } | ||
| 142 | + return data; | ||
| 143 | + } | ||
| 144 | +} | ||
| 145 | + | ||
| 146 | +class Location { | ||
| 147 | + double? lat; | ||
| 148 | + double? lng; | ||
| 149 | + | ||
| 150 | + Location({this.lat, this.lng}); | ||
| 151 | + | ||
| 152 | + Location.fromJson(Map<String, dynamic> json) { | ||
| 153 | + lat = json['lat']; | ||
| 154 | + lng = json['lng']; | ||
| 155 | + } | ||
| 156 | + | ||
| 157 | + Map<String, dynamic> toJson() { | ||
| 158 | + final Map<String, dynamic> data = Map<String, dynamic>(); | ||
| 159 | + data['lat'] = this.lat; | ||
| 160 | + data['lng'] = this.lng; | ||
| 161 | + return data; | ||
| 162 | + } | ||
| 163 | +} | ||
| 164 | + | ||
| 165 | +class Viewport { | ||
| 166 | + Location? northeast; | ||
| 167 | + Location? southwest; | ||
| 168 | + | ||
| 169 | + Viewport({this.northeast, this.southwest}); | ||
| 170 | + | ||
| 171 | + Viewport.fromJson(Map<String, dynamic> json) { | ||
| 172 | + northeast = | ||
| 173 | + json['northeast'] != null ? Location.fromJson(json['northeast']) : null; | ||
| 174 | + southwest = | ||
| 175 | + json['southwest'] != null ? Location.fromJson(json['southwest']) : null; | ||
| 176 | + } | ||
| 177 | + | ||
| 178 | + Map<String, dynamic> toJson() { | ||
| 179 | + final Map<String, dynamic> data = Map<String, dynamic>(); | ||
| 180 | + if (this.northeast != null) { | ||
| 181 | + data['northeast'] = this.northeast!.toJson(); | ||
| 182 | + } | ||
| 183 | + if (this.southwest != null) { | ||
| 184 | + data['southwest'] = this.southwest!.toJson(); | ||
| 185 | + } | ||
| 186 | + return data; | ||
| 187 | + } | ||
| 188 | +} | ||
| 189 | + | ||
| 190 | +class Photos { | ||
| 191 | + int? height; | ||
| 192 | + List<String>? htmlAttributions; | ||
| 193 | + String? photoReference; | ||
| 194 | + int? width; | ||
| 195 | + | ||
| 196 | + Photos({this.height, this.htmlAttributions, this.photoReference, this.width}); | ||
| 197 | + | ||
| 198 | + Photos.fromJson(Map<String, dynamic> json) { | ||
| 199 | + height = json['height']; | ||
| 200 | + htmlAttributions = json['html_attributions'].cast<String>(); | ||
| 201 | + photoReference = json['photo_reference']; | ||
| 202 | + width = json['width']; | ||
| 203 | + } | ||
| 204 | + | ||
| 205 | + Map<String, dynamic> toJson() { | ||
| 206 | + final Map<String, dynamic> data = Map<String, dynamic>(); | ||
| 207 | + data['height'] = this.height; | ||
| 208 | + data['html_attributions'] = this.htmlAttributions; | ||
| 209 | + data['photo_reference'] = this.photoReference; | ||
| 210 | + data['width'] = this.width; | ||
| 211 | + return data; | ||
| 212 | + } | ||
| 213 | +} | ||
| 214 | + | ||
| 215 | +class OpeningHours { | ||
| 216 | + bool? openNow; | ||
| 217 | + | ||
| 218 | + OpeningHours({this.openNow}); | ||
| 219 | + | ||
| 220 | + OpeningHours.fromJson(Map<String, dynamic> json) { | ||
| 221 | + openNow = json['open_now']; | ||
| 222 | + } | ||
| 223 | + | ||
| 224 | + Map<String, dynamic> toJson() { | ||
| 225 | + final Map<String, dynamic> data = Map<String, dynamic>(); | ||
| 226 | + data['open_now'] = this.openNow; | ||
| 227 | + return data; | ||
| 228 | + } | ||
| 229 | +} | ||
| 230 | + | ||
| 231 | +class PlusCode { | ||
| 232 | + String? compoundCode; | ||
| 233 | + String? globalCode; | ||
| 234 | + | ||
| 235 | + PlusCode({this.compoundCode, this.globalCode}); | ||
| 236 | + | ||
| 237 | + PlusCode.fromJson(Map<String, dynamic> json) { | ||
| 238 | + compoundCode = json['compound_code']; | ||
| 239 | + globalCode = json['global_code']; | ||
| 240 | + } | ||
| 241 | + | ||
| 242 | + Map<String, dynamic> toJson() { | ||
| 243 | + final Map<String, dynamic> data = Map<String, dynamic>(); | ||
| 244 | + data['compound_code'] = this.compoundCode; | ||
| 245 | + data['global_code'] = this.globalCode; | ||
| 246 | + return data; | ||
| 247 | + } | ||
| 248 | +} |
| 1 | import 'dart:async'; | 1 | import 'dart:async'; |
| 2 | -import 'dart:math'; | 2 | +import 'dart:convert'; |
| 3 | - | 3 | +import 'package:Parlando/models/nearby_response.dart' as nearby; |
| 4 | -import 'package:location/location.dart'; | ||
| 5 | import 'package:flutter/material.dart'; | 4 | import 'package:flutter/material.dart'; |
| 6 | import 'package:Parlando/widgets/my_button.dart'; | 5 | import 'package:Parlando/widgets/my_button.dart'; |
| 7 | import 'package:Parlando/widgets/search_bar.dart'; | 6 | import 'package:Parlando/widgets/search_bar.dart'; |
| 8 | import 'package:getwidget/getwidget.dart'; | 7 | import 'package:getwidget/getwidget.dart'; |
| 9 | import 'package:google_maps_flutter/google_maps_flutter.dart'; | 8 | import 'package:google_maps_flutter/google_maps_flutter.dart'; |
| 10 | - | 9 | +import 'package:http/http.dart' as http; |
| 11 | -import '../../routers/fluro_navigator.dart'; | 10 | +import 'package:location/location.dart'; |
| 12 | -import '../../util/toast_utils.dart'; | ||
| 13 | 11 | ||
| 14 | class AddressSelectPage extends StatefulWidget { | 12 | class AddressSelectPage extends StatefulWidget { |
| 15 | const AddressSelectPage({Key? key}) : super(key: key); | 13 | const AddressSelectPage({Key? key}) : super(key: key); |
| ... | @@ -28,6 +26,10 @@ class AddressSelectPageState extends State<AddressSelectPage> { | ... | @@ -28,6 +26,10 @@ class AddressSelectPageState extends State<AddressSelectPage> { |
| 28 | int _markerIdCounter = 1; | 26 | int _markerIdCounter = 1; |
| 29 | Map<MarkerId, Marker> markers = <MarkerId, Marker>{}; | 27 | Map<MarkerId, Marker> markers = <MarkerId, Marker>{}; |
| 30 | late StreamSubscription _locationSubscription; | 28 | late StreamSubscription _locationSubscription; |
| 29 | + String radius = "30"; | ||
| 30 | + String apiKey = ""; | ||
| 31 | + nearby.NearbyPlacesResponse nearbyPlacesResponse = | ||
| 32 | + nearby.NearbyPlacesResponse(); | ||
| 31 | 33 | ||
| 32 | @override | 34 | @override |
| 33 | void dispose() { | 35 | void dispose() { |
| ... | @@ -44,7 +46,6 @@ class AddressSelectPageState extends State<AddressSelectPage> { | ... | @@ -44,7 +46,6 @@ class AddressSelectPageState extends State<AddressSelectPage> { |
| 44 | 46 | ||
| 45 | Future<void> _getCurrentLocation() async { | 47 | Future<void> _getCurrentLocation() async { |
| 46 | Location location = Location(); | 48 | Location location = Location(); |
| 47 | - | ||
| 48 | bool serviceEnabled; | 49 | bool serviceEnabled; |
| 49 | PermissionStatus permissionGranted; | 50 | PermissionStatus permissionGranted; |
| 50 | serviceEnabled = await location.serviceEnabled(); | 51 | serviceEnabled = await location.serviceEnabled(); |
| ... | @@ -68,6 +69,15 @@ class AddressSelectPageState extends State<AddressSelectPage> { | ... | @@ -68,6 +69,15 @@ class AddressSelectPageState extends State<AddressSelectPage> { |
| 68 | }); | 69 | }); |
| 69 | } | 70 | } |
| 70 | 71 | ||
| 72 | + void getNearbyPlaces() async { | ||
| 73 | + var url = Uri.parse( | ||
| 74 | + '${'https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=${_center.latitude},${_center.longitude}&radius=$radius'}&key=$apiKey'); | ||
| 75 | + var response = await http.post(url); | ||
| 76 | + nearbyPlacesResponse = | ||
| 77 | + nearby.NearbyPlacesResponse.fromJson(jsonDecode(response.body)); | ||
| 78 | + setState(() {}); | ||
| 79 | + } | ||
| 80 | + | ||
| 71 | void _onMapCreated(GoogleMapController controller) { | 81 | void _onMapCreated(GoogleMapController controller) { |
| 72 | mapController = controller; | 82 | mapController = controller; |
| 73 | final String markerIdVal = 'marker_id_$_markerIdCounter'; | 83 | final String markerIdVal = 'marker_id_$_markerIdCounter'; | ... | ... |
This diff is collapsed. Click to expand it.
| ... | @@ -126,6 +126,7 @@ dependencies: | ... | @@ -126,6 +126,7 @@ dependencies: |
| 126 | wakelock: ^0.6.1+2 | 126 | wakelock: ^0.6.1+2 |
| 127 | location: ^4.4.0 | 127 | location: ^4.4.0 |
| 128 | google_maps_flutter: ^2.1.10 | 128 | google_maps_flutter: ^2.1.10 |
| 129 | + http: ^0.13.5 | ||
| 129 | 130 | ||
| 130 | dependency_overrides: | 131 | dependency_overrides: |
| 131 | decimal: 1.5.0 | 132 | decimal: 1.5.0 | ... | ... |
-
Please register or login to post a comment