image_widget.dart 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import 'dart:typed_data';
  2. import 'package:flutter/material.dart';
  3. import 'package:myapp/core/lru_map.dart';
  4. import 'package:myapp/models/photo.dart';
  5. import 'package:photo_manager/photo_manager.dart';
  6. class ImageWidget extends StatefulWidget {
  7. final Photo photo;
  8. final int size;
  9. const ImageWidget(
  10. this.photo, {
  11. Key key,
  12. this.size,
  13. }) : super(key: key);
  14. @override
  15. _ImageWidgetState createState() => _ImageWidgetState();
  16. }
  17. class _ImageWidgetState extends State<ImageWidget> {
  18. static final Widget loadingWidget = Container(
  19. alignment: Alignment.center,
  20. color: Colors.grey[500],
  21. );
  22. @override
  23. Widget build(BuildContext context) {
  24. final size = widget.size == null ? 124 : widget.size;
  25. final cachedImageData =
  26. ImageLruCache.getData(widget.photo.generatedId, size);
  27. Widget image;
  28. if (cachedImageData != null) {
  29. image = _buildImage(cachedImageData, size);
  30. } else {
  31. if (widget.photo.localId != null) {
  32. image = FutureBuilder<Uint8List>(
  33. future: AssetEntity(id: widget.photo.localId)
  34. .thumbDataWithSize(size, size),
  35. builder: (context, snapshot) {
  36. if (snapshot.hasData) {
  37. ImageLruCache.setData(
  38. widget.photo.generatedId, size, snapshot.data);
  39. Image image = _buildImage(snapshot.data, size);
  40. return image;
  41. } else {
  42. return loadingWidget;
  43. }
  44. },
  45. );
  46. } else {
  47. // TODO
  48. return Text("Not Implemented");
  49. }
  50. }
  51. return image;
  52. }
  53. Image _buildImage(Uint8List data, int size) {
  54. return Image.memory(data,
  55. width: size.toDouble(), height: size.toDouble(), fit: BoxFit.cover);
  56. }
  57. }