image_widget.dart 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import 'dart:io';
  2. import 'package:flutter/material.dart';
  3. import 'package:myapp/core/lru_map.dart';
  4. import 'package:myapp/photo_loader.dart';
  5. import 'package:myapp/ui/loading_widget.dart';
  6. import 'package:provider/provider.dart';
  7. class ImageWidget extends StatefulWidget {
  8. final String path;
  9. const ImageWidget({
  10. Key key,
  11. this.path,
  12. }) : super(key: key);
  13. @override
  14. _ImageWidgetState createState() => _ImageWidgetState();
  15. }
  16. class _ImageWidgetState extends State<ImageWidget> {
  17. PhotoLoader get photoLoader => Provider.of<PhotoLoader>(context);
  18. @override
  19. Widget build(BuildContext context) {
  20. final path = widget.path;
  21. final size = 124;
  22. final cachedImage = ImageLruCache.getData(path, size);
  23. Widget image;
  24. if (cachedImage != null) {
  25. image = cachedImage;
  26. } else {
  27. image = FutureBuilder<Image>(
  28. future: _buildImageWidget(path, size),
  29. builder: (context, snapshot) {
  30. if (snapshot.hasData) {
  31. ImageLruCache.setData(path, size, snapshot.data);
  32. return snapshot.data;
  33. } else {
  34. return loadWidget;
  35. }
  36. },
  37. );
  38. }
  39. return image;
  40. }
  41. Future<Image> _buildImageWidget(String path, num size) async {
  42. return Image.file(File(path),
  43. width: size.toDouble(), height: size.toDouble(), fit: BoxFit.cover);
  44. }
  45. @override
  46. void didUpdateWidget(ImageWidget oldWidget) {
  47. super.didUpdateWidget(oldWidget);
  48. if (widget.path != oldWidget.path) {
  49. setState(() {});
  50. }
  51. }
  52. }