fix(mobile): location button map beta timeline (#21590)

fix(mobile): location button map
This commit is contained in:
Yaros 2025-09-04 20:26:16 +02:00 committed by GitHub
parent 51aec1e93d
commit 538263dc38
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -47,10 +47,12 @@ class _DriftMapState extends ConsumerState<DriftMap> {
MapLibreMapController? mapController; MapLibreMapController? mapController;
final _reloadMutex = AsyncMutex(); final _reloadMutex = AsyncMutex();
final _debouncer = Debouncer(interval: const Duration(milliseconds: 500), maxWaitTime: const Duration(seconds: 2)); final _debouncer = Debouncer(interval: const Duration(milliseconds: 500), maxWaitTime: const Duration(seconds: 2));
final ValueNotifier<double> bottomSheetOffset = ValueNotifier(0.25);
@override @override
void dispose() { void dispose() {
_debouncer.dispose(); _debouncer.dispose();
bottomSheetOffset.dispose();
super.dispose(); super.dispose();
} }
@ -157,8 +159,8 @@ class _DriftMapState extends ConsumerState<DriftMap> {
return Stack( return Stack(
children: [ children: [
_Map(initialLocation: widget.initialLocation, onMapCreated: onMapCreated, onMapReady: onMapReady), _Map(initialLocation: widget.initialLocation, onMapCreated: onMapCreated, onMapReady: onMapReady),
_MyLocationButton(onZoomToLocation: onZoomToLocation), _DynamicBottomSheet(bottomSheetOffset: bottomSheetOffset),
const MapBottomSheet(), _DynamicMyLocationButton(onZoomToLocation: onZoomToLocation, bottomSheetOffset: bottomSheetOffset),
], ],
); );
} }
@ -191,21 +193,53 @@ class _Map extends StatelessWidget {
} }
} }
class _MyLocationButton extends StatelessWidget { class _DynamicBottomSheet extends StatefulWidget {
const _MyLocationButton({required this.onZoomToLocation}); final ValueNotifier<double> bottomSheetOffset;
const _DynamicBottomSheet({required this.bottomSheetOffset});
@override
State<_DynamicBottomSheet> createState() => _DynamicBottomSheetState();
}
class _DynamicBottomSheetState extends State<_DynamicBottomSheet> {
@override
Widget build(BuildContext context) {
return NotificationListener<DraggableScrollableNotification>(
onNotification: (notification) {
widget.bottomSheetOffset.value = notification.extent;
return true;
},
child: const MapBottomSheet(),
);
}
}
class _DynamicMyLocationButton extends StatelessWidget {
const _DynamicMyLocationButton({required this.onZoomToLocation, required this.bottomSheetOffset});
final VoidCallback onZoomToLocation; final VoidCallback onZoomToLocation;
final ValueNotifier<double> bottomSheetOffset;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return ValueListenableBuilder<double>(
valueListenable: bottomSheetOffset,
builder: (context, offset, child) {
return Positioned( return Positioned(
right: 0, right: 16,
bottom: context.padding.bottom + 16, bottom: context.height * (offset - 0.02) + context.padding.bottom,
child: AnimatedOpacity(
opacity: offset < 0.8 ? 1 : 0,
duration: const Duration(milliseconds: 150),
child: ElevatedButton( child: ElevatedButton(
onPressed: onZoomToLocation, onPressed: onZoomToLocation,
style: ElevatedButton.styleFrom(shape: const CircleBorder()), style: ElevatedButton.styleFrom(shape: const CircleBorder()),
child: const Icon(Icons.my_location), child: const Icon(Icons.my_location),
), ),
),
);
},
); );
} }
} }