58 lines
1.3 KiB
Dart
58 lines
1.3 KiB
Dart
import 'dart:typed_data';
|
|
|
|
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});
|
|
|
|
final String url;
|
|
|
|
@override
|
|
State<HiveTileImage> createState() => _HiveTileImageState();
|
|
}
|
|
|
|
class _HiveTileImageState extends State<HiveTileImage> {
|
|
Uint8List? _bytes;
|
|
String? _loadingUrl;
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
_load(widget.url);
|
|
}
|
|
|
|
@override
|
|
void didUpdateWidget(covariant HiveTileImage oldWidget) {
|
|
super.didUpdateWidget(oldWidget);
|
|
if (oldWidget.url != widget.url) {
|
|
_load(widget.url);
|
|
}
|
|
}
|
|
|
|
Future<void> _load(String url) async {
|
|
_loadingUrl = url;
|
|
final bytes = await HiveTileCache.getOrFetch(url);
|
|
if (!mounted || _loadingUrl != url) return;
|
|
if (bytes != null && bytes.isNotEmpty) {
|
|
setState(() {
|
|
_bytes = bytes;
|
|
});
|
|
}
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final bytes = _bytes;
|
|
if (bytes == null || bytes.isEmpty) {
|
|
return const ColoredBox(color: Color(0xFFE0E0E0));
|
|
}
|
|
return Image.memory(
|
|
bytes,
|
|
fit: BoxFit.cover,
|
|
gaplessPlayback: true,
|
|
filterQuality: FilterQuality.low,
|
|
);
|
|
}
|
|
}
|