fix appstate repeated instantiation

This commit is contained in:
stopflock
2025-08-10 00:53:01 -05:00
parent 6bf9556c65
commit 641344271f
7 changed files with 55 additions and 45 deletions
+8 -6
View File
@@ -95,15 +95,16 @@ class _MapViewState extends State<MapView> {
List<String> _lastProfileIds = [];
UploadMode? _lastUploadMode;
void _maybeRefreshCameras(AppState appState) {
void _maybeRefreshCameras() {
final appState = context.read<AppState>();
final currProfileIds = appState.enabledProfiles.map((p) => p.id).toList();
final currMode = appState.uploadMode;
if (_lastProfileIds.isEmpty ||
if (_lastProfileIds.isEmpty ||
currProfileIds.length != _lastProfileIds.length ||
!_lastProfileIds.asMap().entries.every((entry) => currProfileIds[entry.key] == entry.value) ||
_lastUploadMode != currMode) {
// If this is first load, or list/ids/mode changed, refetch
_debounce(() => _refreshCameras(appState));
_debounce(_refreshCameras);
_lastProfileIds = List.from(currProfileIds);
_lastUploadMode = currMode;
}
@@ -149,7 +150,8 @@ class _MapViewState extends State<MapView> {
});
}
Future<void> _refreshCameras(AppState appState) async {
Future<void> _refreshCameras() async {
final appState = context.read<AppState>();
LatLngBounds? bounds;
try {
bounds = _controller.camera.visibleBounds;
@@ -181,7 +183,7 @@ class _MapViewState extends State<MapView> {
// Refetch only if profiles or mode changed
// This avoids repeated fetches on every build
// We track last seen values (local to the State class)
_maybeRefreshCameras(appState);
_maybeRefreshCameras();
// Seed addmode target once, after first controller center is available.
if (session != null && session.target == null) {
@@ -235,7 +237,7 @@ class _MapViewState extends State<MapView> {
if (session != null) {
appState.updateSession(target: pos.center);
}
_debounce(() => _refreshCameras(appState));
_debounce(_refreshCameras);
},
),
children: [
+4 -2
View File
@@ -4,13 +4,13 @@ import 'package:flutter/material.dart';
import 'package:flutter_map/flutter_map.dart';
import 'package:flutter/scheduler.dart';
import '../services/map_data_provider.dart';
import '../app_state.dart';
/// Singleton in-memory tile cache and async provider for custom tiles.
class TileProviderWithCache extends TileProvider {
static final Map<String, Uint8List> _tileCache = {};
static Map<String, Uint8List> get tileCache => _tileCache;
final VoidCallback? onTileCacheUpdated;
TileProviderWithCache({this.onTileCacheUpdated});
@override
@@ -29,7 +29,9 @@ class TileProviderWithCache extends TileProvider {
// Don't fire multiple fetches for the same tile simultaneously
if (_tileCache.containsKey(key)) return;
try {
final bytes = await MapDataProvider().getTile(z: coords.z, x: coords.x, y: coords.y);
final bytes = await MapDataProvider().getTile(
z: coords.z, x: coords.x, y: coords.y,
);
if (bytes.isNotEmpty) {
_tileCache[key] = Uint8List.fromList(bytes);
print('[TileProviderWithCache] Cached tile $key, bytes=${bytes.length}');