import 'dart:async'; import 'dart:math'; import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart'; import 'package:flutter_map_location_marker/flutter_map_location_marker.dart'; import 'package:flutter_remix/flutter_remix.dart'; import 'package:furman_now/src/services/restaurants/restaurant_service.dart'; @immutable class MapCategory { final String name; final IconData icon; final Function activator; const MapCategory({ required this.name, required this.icon, required this.activator, }); } class MapPageState extends ChangeNotifier { MapPageState({ required TickerProvider vsync }): _animationController = AnimationController( duration: const Duration(milliseconds: 300), vsync: vsync, ) { _initState(); } void _initState() { mapController.mapEventStream.listen((event) { if (event is MapEventRotate) { rotation = mapController.rotation * (2 * pi) / 360; } }); centerOnLocationUpdate = CenterOnLocationUpdate.always; centerCurrentLocationStreamController = StreamController(); } final MapController mapController = MapController(); final AnimationController _animationController; late CenterOnLocationUpdate _centerOnLocationUpdate; CenterOnLocationUpdate get centerOnLocationUpdate => _centerOnLocationUpdate; set centerOnLocationUpdate (CenterOnLocationUpdate value) { _centerOnLocationUpdate = value; notifyListeners(); } late StreamController centerCurrentLocationStreamController; var _rotation = 0.0; double get rotation => _rotation; set rotation (double value) { _rotation = value; notifyListeners(); } List _markers = []; List get markers => _markers; set markers (List value) { _markers = value; notifyListeners(); } void resetRotation() async { // take the shortest rotation path var end = mapController.rotation > 180 ? 360.0 : 0.0; var animation = Tween( begin: mapController.rotation, end: end, ).animate(CurvedAnimation( parent: _animationController, curve: Curves.easeInOut, )); animationListener() { mapController.rotate(animation.value); } animation.addListener(animationListener); await _animationController.forward(); animation.removeListener(animationListener); _animationController.reset(); mapController.rotate(0); } late final List categories = [ MapCategory( name: "Restaurants", icon: FlutterRemix.restaurant_line, activator: showRestaurants, ), ]; Future showRestaurants() async { var restaurants = await RestaurantService.fetchRestaurants(); var newMarkers = restaurants.map((restaurant) => Marker( point: restaurant.mapLocation, width: 40, height: 40, builder: (context) => GestureDetector( onTapDown: (e) => print("tapped"), child: const FlutterLogo() ), )); markers = newMarkers.toList(); } }