ente/lib/ui/image_widget.dart

70 lines
1.8 KiB
Dart

import 'dart:io';
import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:myapp/core/lru_map.dart';
import 'package:myapp/models/photo.dart';
import 'package:photo_manager/photo_manager.dart';
class ImageWidget extends StatefulWidget {
final Photo photo;
const ImageWidget(
this.photo, {
Key key,
}) : super(key: key);
@override
_ImageWidgetState createState() => _ImageWidgetState();
}
class _ImageWidgetState extends State<ImageWidget> {
static final Widget loadingWidget = Container(
alignment: Alignment.center,
color: Colors.grey[500],
);
@override
Widget build(BuildContext context) {
final path = widget.photo.localPath;
final size = 124;
final cachedImage = ImageLruCache.getData(path, size);
Widget image;
if (cachedImage != null) {
image = cachedImage;
} else {
if (widget.photo.localId != null) {
image = FutureBuilder<Uint8List>(
future: AssetEntity(id: widget.photo.localId)
.thumbDataWithSize(size, size),
builder: (context, snapshot) {
if (snapshot.hasData) {
Image image = Image.memory(snapshot.data,
width: size.toDouble(),
height: size.toDouble(),
fit: BoxFit.cover);
ImageLruCache.setData(path, size, image);
return image;
} else {
return loadingWidget;
}
},
);
} else {
image = Image.file(File(widget.photo.localPath),
width: size.toDouble(), height: size.toDouble(), fit: BoxFit.cover);
}
}
return image;
}
@override
void didUpdateWidget(ImageWidget oldWidget) {
super.didUpdateWidget(oldWidget);
if (widget.photo.localPath != oldWidget.photo.localPath) {
setState(() {});
}
}
}