working state with dynamic location tracker
This commit is contained in:
		| @@ -1,13 +1,62 @@ | ||||
| import 'package:flutter/material.dart'; | ||||
|  | ||||
| Widget singleDestination(BuildContext context, String title, String description, String image) { | ||||
|  | ||||
|  | ||||
| List<Widget> loadDestinations() { | ||||
|   List<Widget> cities =  [ | ||||
|     singleDestination( | ||||
|       "New York", | ||||
|       "The Big Apple", | ||||
|       "https://upload.wikimedia.org/wikipedia/commons/thumb/3/34/View_of_New_York_City.jpg/800px-View_of_New_York_City.jpg" | ||||
|     ), | ||||
|     singleDestination( | ||||
|       "Los Angeles", | ||||
|       "City of Angels", | ||||
|       "https://upload.wikimedia.org/wikipedia/commons/thumb/8/8d/Los_Angeles_City_Hall_2013.jpg/800px-Los_Angeles_City_Hall_2013.jpg" | ||||
|     ), | ||||
|     singleDestination( | ||||
|       "Chicago", | ||||
|       "The Windy City", | ||||
|       "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6f/Chicago_skyline%2C_viewed_from_John_Hancock_Center.jpg/800px-Chicago_skyline%2C_viewed_from_John_Hancock_Center.jpg" | ||||
|     ), | ||||
|     singleDestination( | ||||
|       "San Francisco", | ||||
|       "The Golden City", | ||||
|       "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6d/San_Francisco_City_Hall_2013.jpg/800px-San_Francisco_City_Hall_2013.jpg" | ||||
|     ), | ||||
|     singleDestination( | ||||
|       "Miami", | ||||
|       "The Magic City", | ||||
|       "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6e/Miami_collage.jpg/800px-Miami_collage.jpg" | ||||
|     ), | ||||
|     singleDestination( | ||||
|       "Las Vegas", | ||||
|       "Sin City", | ||||
|       "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6e/Las_Vegas_Strip.jpg/800px-Las_Vegas_Strip.jpg" | ||||
|     ), | ||||
|     singleDestination( | ||||
|       "Seattle", | ||||
|       "Emerald City", | ||||
|       "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2f/Seattle_Kerry_Park_Skyline.jpg/800px-Seattle_Kerry_Park_Skyline.jpg" | ||||
|     ), | ||||
|     singleDestination( | ||||
|       "Boston", | ||||
|       "Beantown", | ||||
|       "https://upload.wikimedia.org/wikipedia/commons/thumb/0/0f/Boston_skyline_from_Longfellow_Bridge_September_2017_panorama_2.jpg/800px-Boston" | ||||
|     ) | ||||
|   ]; | ||||
|   cities.shuffle(); | ||||
|   return cities; | ||||
| } | ||||
|  | ||||
| Widget singleDestination(String title, String description, String image) { | ||||
|   return Card( | ||||
|     child: ListTile( | ||||
|       leading: Icon(Icons.location_on), | ||||
|       title: Text(title), | ||||
|       subtitle: Text(description), | ||||
|       onTap: () { | ||||
|         Navigator.pushNamed(context, '/destination'); | ||||
|         // Navigator.pushNamed(context, '/destination'); | ||||
|       }, | ||||
|     ), | ||||
|   ); | ||||
|   | ||||
| @@ -1,14 +1,74 @@ | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:flutter_map/flutter_map.dart'; | ||||
| import 'package:sliding_up_panel/sliding_up_panel.dart'; | ||||
| import 'package:latlong2/latlong.dart'; | ||||
| import 'package:geocoding/geocoding.dart'; | ||||
| import 'package:geocode/geocode.dart'; | ||||
| import 'dart:async'; | ||||
|  | ||||
| import 'package:fast_network_navigation/modules/navigation.dart'; | ||||
|  | ||||
| class MapPage extends StatefulWidget { | ||||
|   @override | ||||
|   _MapPageState createState() => _MapPageState(); | ||||
| } | ||||
| class Debounce { | ||||
|   Duration delay; | ||||
|   Timer? _timer; | ||||
|  | ||||
|   Debounce( | ||||
|     this.delay, | ||||
|   ); | ||||
|  | ||||
|   call(void Function() callback) { | ||||
|     _timer?.cancel(); | ||||
|     _timer = Timer(delay, callback); | ||||
|   } | ||||
|  | ||||
|   dispose() { | ||||
|     _timer?.cancel(); | ||||
|   } | ||||
| } | ||||
|  | ||||
|  | ||||
| class _MapPageState extends State<MapPage> { | ||||
|   GeoCode geoCode = GeoCode(); | ||||
|   final mapController = MapController(); | ||||
|   String _currentCityName = "..."; | ||||
|   final Debounce _debounce = Debounce(Duration(seconds: 3)); | ||||
|  | ||||
|   void _setCurrentCityName() async { | ||||
|     if (mapController.camera.zoom < 9) { | ||||
|       return; // Don't bother if the view is too wide | ||||
|     } | ||||
|     var currentCoordinates = mapController.camera.center; | ||||
|     String? city; | ||||
|      | ||||
|     try{ | ||||
|       List<Placemark> placemarks = await placemarkFromCoordinates(currentCoordinates.latitude, currentCoordinates.longitude); | ||||
|       city = placemarks[0].locality.toString(); | ||||
|     } catch (e) { | ||||
|       debugPrint("Error: $e"); | ||||
|       try { | ||||
|         Address address = await geoCode.reverseGeocoding(latitude: currentCoordinates.latitude, longitude: currentCoordinates.longitude); | ||||
|          | ||||
|         if (address.city == null || address.city.toString().contains("Throttled!")){ | ||||
|           throw Exception("Probably rate limited"); | ||||
|         } | ||||
|         city = address.city.toString(); | ||||
|       } catch (e) { | ||||
|         debugPrint("Error: $e"); | ||||
|  | ||||
|       } | ||||
|     } | ||||
|     if (city != null) { | ||||
|       setState(() { | ||||
|         _currentCityName = city!; | ||||
|       }); | ||||
|     } else { | ||||
|       _debounce(() async {_setCurrentCityName();}); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
| @@ -18,8 +78,15 @@ class _MapPageState extends State<MapPage> { | ||||
|         panel: _floatingPanel(theme), | ||||
|         collapsed: _floatingCollapsed(theme), | ||||
|         body: FlutterMap( | ||||
|           mapController: mapController, | ||||
|           options: MapOptions( | ||||
|             initialZoom: 11, | ||||
|             initialCenter: LatLng(51.509364, -0.128928), | ||||
|             onMapReady: () { | ||||
|                 mapController.mapEventStream.listen((evt) {_debounce(() async {_setCurrentCityName();});}); | ||||
|                 // And any other `MapController` dependent non-movement methods | ||||
|             }, | ||||
|  | ||||
|           ), | ||||
|           children: [ | ||||
|             openStreetMapTileLayer, | ||||
| @@ -59,14 +126,7 @@ class _MapPageState extends State<MapPage> { | ||||
|             children: <Widget>[ | ||||
|               Greeting(theme), | ||||
|               Text("Got a lot to do today! Here is a rundown:"), | ||||
|               singleDestination(context, "Location 1", "some description", "Further information"), | ||||
|               singleDestination(context, "Location 2", "some description", "Further information"), | ||||
|               singleDestination(context, "Location 3", "some description", "Further information"), | ||||
|               singleDestination(context, "Location 4", "some description", "Further information"), | ||||
|               singleDestination(context, "Location 5", "some description", "Further information"), | ||||
|               singleDestination(context, "Location 6", "some description", "Further information"), | ||||
|               singleDestination(context, "Location 7", "some description", "Further information"), | ||||
|               singleDestination(context, "Location 8", "some description", "Further information"), | ||||
|               ...loadDestinations(), | ||||
|             ], | ||||
|           ), | ||||
|         ), | ||||
| @@ -78,7 +138,7 @@ class _MapPageState extends State<MapPage> { | ||||
|   Widget Greeting (ThemeData theme) { | ||||
|     return Center( | ||||
|         child: Text( | ||||
|           "Explore Kview", | ||||
|             "Explore ${_currentCityName}", | ||||
|           style: TextStyle(color: theme.primaryColor, fontSize: 24.0, fontWeight: FontWeight.bold), | ||||
|         ), | ||||
|       ); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user