mirror of
https://github.com/FoggedLens/deflock-app.git
synced 2026-07-09 14:17:55 +02:00
Fix map centering when looking at tag sheets, transition to edit sheet
This commit is contained in:
@@ -37,10 +37,17 @@ class SheetCoordinator {
|
||||
|
||||
/// Get the currently active sheet height for map positioning
|
||||
double get activeSheetHeight {
|
||||
if (_addSheetHeight > 0) return _addSheetHeight;
|
||||
if (_editSheetHeight > 0) return _editSheetHeight;
|
||||
if (_navigationSheetHeight > 0) return _navigationSheetHeight;
|
||||
return _tagSheetHeight;
|
||||
final height = _addSheetHeight > 0 ? _addSheetHeight :
|
||||
_editSheetHeight > 0 ? _editSheetHeight :
|
||||
_navigationSheetHeight > 0 ? _navigationSheetHeight :
|
||||
_tagSheetHeight;
|
||||
|
||||
// Add debug logging to help troubleshoot sheet height coordination
|
||||
if (height > 0) {
|
||||
debugPrint('[SheetCoordinator] Active sheet height: $height (add: $_addSheetHeight, edit: $_editSheetHeight, nav: $_navigationSheetHeight, tag: $_tagSheetHeight)');
|
||||
}
|
||||
|
||||
return height;
|
||||
}
|
||||
|
||||
/// Update sheet state tracking
|
||||
@@ -100,6 +107,7 @@ class SheetCoordinator {
|
||||
bottom: MediaQuery.of(context).padding.bottom, // Only safe area, no keyboard
|
||||
),
|
||||
child: MeasuredSheet(
|
||||
debugLabel: 'AddNode',
|
||||
onHeightChanged: (height) {
|
||||
_addSheetHeight = height + MediaQuery.of(context).padding.bottom;
|
||||
onStateChanged();
|
||||
@@ -163,6 +171,7 @@ class SheetCoordinator {
|
||||
bottom: MediaQuery.of(context).viewInsets.bottom + MediaQuery.of(context).padding.bottom,
|
||||
),
|
||||
child: MeasuredSheet(
|
||||
debugLabel: 'EditNode',
|
||||
onHeightChanged: (height) {
|
||||
final fullHeight = height + MediaQuery.of(context).viewInsets.bottom + MediaQuery.of(context).padding.bottom;
|
||||
_editSheetHeight = fullHeight;
|
||||
@@ -202,6 +211,7 @@ class SheetCoordinator {
|
||||
bottom: MediaQuery.of(context).viewInsets.bottom + MediaQuery.of(context).padding.bottom,
|
||||
),
|
||||
child: MeasuredSheet(
|
||||
debugLabel: 'Navigation',
|
||||
onHeightChanged: (height) {
|
||||
final fullHeight = height + MediaQuery.of(context).viewInsets.bottom + MediaQuery.of(context).padding.bottom;
|
||||
_navigationSheetHeight = fullHeight;
|
||||
@@ -239,12 +249,14 @@ class SheetCoordinator {
|
||||
|
||||
/// Update tag sheet height (called externally)
|
||||
void updateTagSheetHeight(double height, VoidCallback onStateChanged) {
|
||||
debugPrint('[SheetCoordinator] Updating tag sheet height: $_tagSheetHeight -> $height');
|
||||
_tagSheetHeight = height;
|
||||
onStateChanged();
|
||||
}
|
||||
|
||||
/// Reset tag sheet height
|
||||
void resetTagSheetHeight(VoidCallback onStateChanged) {
|
||||
debugPrint('[SheetCoordinator] Resetting tag sheet height from: $_tagSheetHeight');
|
||||
_tagSheetHeight = 0.0;
|
||||
onStateChanged();
|
||||
}
|
||||
|
||||
@@ -114,6 +114,9 @@ class _HomeScreenState extends State<HomeScreen> with TickerProviderStateMixin {
|
||||
}
|
||||
|
||||
void _openEditNodeSheet() {
|
||||
// Set transition flag BEFORE closing tag sheet to prevent map bounce
|
||||
_sheetCoordinator.setTransitioningToEdit(true);
|
||||
|
||||
// Close any existing tag sheet first
|
||||
if (_sheetCoordinator.tagSheetHeight > 0) {
|
||||
Navigator.of(context).pop();
|
||||
@@ -298,6 +301,7 @@ class _HomeScreenState extends State<HomeScreen> with TickerProviderStateMixin {
|
||||
bottom: MediaQuery.of(context).padding.bottom, // Only safe area, no keyboard
|
||||
),
|
||||
child: MeasuredSheet(
|
||||
debugLabel: 'NodeTag',
|
||||
onHeightChanged: (height) {
|
||||
_sheetCoordinator.updateTagSheetHeight(
|
||||
height + MediaQuery.of(context).padding.bottom,
|
||||
@@ -355,6 +359,7 @@ class _HomeScreenState extends State<HomeScreen> with TickerProviderStateMixin {
|
||||
bottom: MediaQuery.of(context).padding.bottom, // Only safe area, no keyboard
|
||||
),
|
||||
child: MeasuredSheet(
|
||||
debugLabel: 'SuspectedLocation',
|
||||
onHeightChanged: (height) {
|
||||
_sheetCoordinator.updateTagSheetHeight(
|
||||
height + MediaQuery.of(context).padding.bottom,
|
||||
|
||||
@@ -42,6 +42,9 @@ class _NodeMapMarkerState extends State<NodeMapMarker> {
|
||||
if (widget.onNodeTap != null) {
|
||||
widget.onNodeTap!(widget.node);
|
||||
} else {
|
||||
// Fallback: This should not happen if callbacks are properly provided,
|
||||
// but if it does, at least open the sheet (without map coordination)
|
||||
debugPrint('[NodeMapMarker] Warning: onNodeTap callback not provided, using fallback');
|
||||
showModalBottomSheet(
|
||||
context: context,
|
||||
builder: (_) => NodeTagSheet(node: widget.node),
|
||||
|
||||
@@ -40,6 +40,9 @@ class _SuspectedLocationMapMarkerState extends State<SuspectedLocationMapMarker>
|
||||
if (widget.onLocationTap != null) {
|
||||
widget.onLocationTap!(widget.location);
|
||||
} else {
|
||||
// Fallback: This should not happen if callbacks are properly provided,
|
||||
// but if it does, at least open the sheet (without map coordination)
|
||||
debugPrint('[SuspectedLocationMapMarker] Warning: onLocationTap callback not provided, using fallback');
|
||||
showModalBottomSheet(
|
||||
context: context,
|
||||
builder: (_) => SuspectedLocationSheet(location: widget.location),
|
||||
|
||||
@@ -4,11 +4,13 @@ import 'package:flutter/material.dart';
|
||||
class MeasuredSheet extends StatefulWidget {
|
||||
final Widget child;
|
||||
final ValueChanged<double> onHeightChanged;
|
||||
final String? debugLabel; // Add debug label for troubleshooting
|
||||
|
||||
const MeasuredSheet({
|
||||
super.key,
|
||||
required this.child,
|
||||
required this.onHeightChanged,
|
||||
this.debugLabel,
|
||||
});
|
||||
|
||||
@override
|
||||
@@ -32,8 +34,17 @@ class _MeasuredSheetState extends State<MeasuredSheet> {
|
||||
final height = renderBox.size.height;
|
||||
if (height != _lastHeight) {
|
||||
_lastHeight = height;
|
||||
// Add debug logging to help troubleshoot height measurement issues
|
||||
if (widget.debugLabel != null) {
|
||||
debugPrint('[MeasuredSheet-${widget.debugLabel}] Height changed: $_lastHeight -> $height');
|
||||
}
|
||||
widget.onHeightChanged(height);
|
||||
}
|
||||
} else {
|
||||
// Add debug logging for measurement failures
|
||||
if (widget.debugLabel != null) {
|
||||
debugPrint('[MeasuredSheet-${widget.debugLabel}] Failed to measure height: renderBox is null');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -29,6 +29,8 @@ class SheetAwareMap extends StatelessWidget {
|
||||
// Use the actual available height from constraints, not full screen height
|
||||
final availableHeight = constraints.maxHeight;
|
||||
|
||||
|
||||
|
||||
return Stack(
|
||||
children: [
|
||||
AnimatedPositioned(
|
||||
|
||||
Reference in New Issue
Block a user