add in-memory tile cache, tile fade transitions, and performance HUD to map page

This commit is contained in:
ImBenji
2026-02-27 00:18:43 +00:00
parent d460f0369e
commit 85c595f99c
3 changed files with 587 additions and 82 deletions

View File

@@ -4,9 +4,10 @@ import 'package:flutter/material.dart';
import 'package:rra_app/pages/map/tiles/hive_tile_cache.dart';
class HiveTileImage extends StatefulWidget {
const HiveTileImage({required this.url, super.key});
const HiveTileImage({required this.url, this.onLoaded, super.key});
final String url;
final ValueChanged<String>? onLoaded;
@override
State<HiveTileImage> createState() => _HiveTileImageState();
@@ -15,18 +16,30 @@ class HiveTileImage extends StatefulWidget {
class _HiveTileImageState extends State<HiveTileImage> {
Uint8List? _bytes;
String? _loadingUrl;
bool _reportedLoaded = false;
@override
void initState() {
super.initState();
_load(widget.url);
_bytes = HiveTileCache.peek(widget.url);
if (_bytes != null && _bytes!.isNotEmpty) {
_reportLoaded();
} else {
_load(widget.url);
}
}
@override
void didUpdateWidget(covariant HiveTileImage oldWidget) {
super.didUpdateWidget(oldWidget);
if (oldWidget.url != widget.url) {
_load(widget.url);
_reportedLoaded = false;
_bytes = HiveTileCache.peek(widget.url);
if (_bytes != null && _bytes!.isNotEmpty) {
_reportLoaded();
} else {
_load(widget.url);
}
}
}
@@ -38,20 +51,29 @@ class _HiveTileImageState extends State<HiveTileImage> {
setState(() {
_bytes = bytes;
});
_reportLoaded();
}
}
void _reportLoaded() {
if (_reportedLoaded) return;
_reportedLoaded = true;
widget.onLoaded?.call(widget.url);
}
@override
Widget build(BuildContext context) {
final bytes = _bytes;
if (bytes == null || bytes.isEmpty) {
return const ColoredBox(color: Color(0xFFE0E0E0));
return const ColoredBox(color: Colors.transparent);
}
_reportLoaded();
return Image.memory(
bytes,
scale: widget.url.contains('@2x') ? 2.0 : 1.0,
fit: BoxFit.cover,
gaplessPlayback: true,
filterQuality: FilterQuality.low,
filterQuality: FilterQuality.medium,
);
}
}