Fix map centering when looking at tag sheets, transition to edit sheet

This commit is contained in:
stopflock
2025-12-07 14:48:45 -06:00
parent 56d55bb922
commit 405ec220d0
9 changed files with 214 additions and 5 deletions
@@ -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();
}
+5
View File
@@ -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,
+3
View File
@@ -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),
+11
View File
@@ -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');
}
}
}
+2
View File
@@ -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(