Untitled
user_6232722
plain_text
a year ago
5.4 kB
11
Indexable
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'map_controller.dart';
class MarkerItem {
final int id;
final double latitude;
final double longitude;
MarkerItem({
required this.id,
required this.latitude,
required this.longitude,
});
}
class InteractiveMapsMarker extends StatefulWidget {
final LatLng center;
final double itemHeight;
final double zoom;
final double zoomFocus;
final bool zoomKeepOnTap;
final Set<Marker> markers;
final IndexedWidgetBuilder? itemContent;
final IndexedWidgetBuilder? itemBuilder;
final EdgeInsetsGeometry itemPadding;
final Alignment contentAlignment;
final InteractiveMapsController? controller;
final VoidCallback? onLastItem;
final Uint8List? markerIcon;
final Uint8List? markerIconSelected;
InteractiveMapsMarker({
super.key,
required this.markers,
this.itemBuilder,
this.center = const LatLng(0.0, 0.0),
this.itemContent,
this.itemHeight = 116.0,
this.zoom = 12.0,
this.zoomFocus = 15.0,
this.zoomKeepOnTap = false,
this.itemPadding = const EdgeInsets.only(bottom: 80.0),
this.contentAlignment = Alignment.bottomCenter,
this.controller,
this.onLastItem,
this.markerIcon,
this.markerIconSelected,
}) {
if (itemBuilder == null && itemContent == null) {
throw Exception('itemBuilder or itemContent must be provided');
}
}
@override
InteractiveMapsMarkerState createState() => InteractiveMapsMarkerState();
}
class InteractiveMapsMarkerState extends State<InteractiveMapsMarker> {
final Completer<GoogleMapController> _controller = Completer();
GoogleMapController? mapController;
final PageController pageController = PageController(viewportFraction: 1);
final ValueNotifier<int?> selectedMarker = ValueNotifier<int?>(0);
double mapRotation = 0;
int currentIndex = 0;
late LatLng currentLocation;
double currentZoom = 0;
@override
void initState() {
super.initState();
// markers = widget.items
// .asMap()
// .map(
// (index, item) => MapEntry(
// index,
// Marker(
// markerId: MarkerId(item.id.toString()),
// position: LatLng(item.latitude, item.longitude),
// onTap: () {
// pageController.animateToPage(
// index,
// duration: const Duration(milliseconds: 500),
// curve: Curves.ease,
// );
// },
// ),
// ),
// )
// .values
// .toSet();
currentLocation = widget.center;
WidgetsBinding.instance.addPostFrameCallback((_) {
// _zoomToCurrentMarker();
});
}
@override
void didChangeDependencies() {
super.didChangeDependencies();
}
void _onMapCreated(GoogleMapController controller) async {
mapController = controller;
final mapStyle = await rootBundle.loadString('assets/json/map_style.json');
mapController?.setMapStyle(mapStyle);
_controller.complete(controller);
}
void _updateMapRotation(double newBearing) {
mapController?.animateCamera(
CameraUpdate.newCameraPosition(
CameraPosition(
target: currentLocation,
zoom: currentZoom,
bearing: newBearing,
),
),
);
}
void _onCameraMove(CameraPosition position) {
setState(() {
mapRotation = position.bearing;
currentLocation = position.target;
currentZoom = position.zoom;
});
}
@override
Widget build(BuildContext context) {
return Stack(
children: <Widget>[
_buildMap(),
],
);
}
Widget _buildMap() {
return Positioned.fill(
child: ValueListenableBuilder<int?>(
valueListenable: selectedMarker,
builder: (context, value, child) {
return GoogleMap(
zoomControlsEnabled: false,
clusterManagers:
padding: const EdgeInsets.only(
top: 180,
),
onCameraMove: _onCameraMove,
markers: widget.markers,
buildingsEnabled: false,
myLocationEnabled: true,
myLocationButtonEnabled: true,
onMapCreated: _onMapCreated,
initialCameraPosition: CameraPosition(
target: widget.center,
zoom: widget.zoom,
),
rotateGesturesEnabled: true,
zoomGesturesEnabled: true,
scrollGesturesEnabled: true,
tiltGesturesEnabled: true,
);
},
),
);
}
void _pageChanged(int index) {
setState(() => currentIndex = index);
widget.onLastItem?.call();
// _zoomToCurrentMarker();
}
// void _zoomToCurrentMarker() {
// if (mapController == null || widget.markers.isEmpty) return;
// final marker = widget.markers[currentIndex];
// mapController?.animateCamera(
// widget.zoomKeepOnTap
// ? CameraUpdate.newLatLng(LatLng(marker.latitude, marker.longitude))
// : CameraUpdate.newCameraPosition(
// CameraPosition(
// target: LatLng(marker.latitude, marker.longitude),
// zoom: widget.zoomFocus,
// ),
// ),
// );
// }
}
Editor is loading...
Leave a Comment