import 'dart:typed_data'; import 'package:chat/photo/engine/lru_cache.dart'; import 'package:flutter/material.dart'; import 'package:photo_manager/photo_manager.dart'; class FirstPhotoItem extends StatefulWidget { final AssetPathEntity pathEntity; final double size; final Function onSelectFolder; const FirstPhotoItem( {Key key, this.pathEntity, this.size = 50, this.onSelectFolder}) : super(key: key); @override _FirstPhotoItemState createState() => _FirstPhotoItemState(); } class _FirstPhotoItemState extends State { AssetEntity entity; @override void initState() { super.initState(); getAssetEntity(); } Widget _buildImg(Uint8List data) { return ClipRRect( borderRadius: BorderRadius.circular(8), child: Image.memory( data, width: widget.size, height: widget.size, fit: BoxFit.contain, )); } Future getAssetEntity() async { var entityList = await widget.pathEntity.getAssetListPaged(0, 1); setState(() { entity = entityList.first; }); } @override Widget build(BuildContext context) { Widget leading; if (entity == null) { leading = Container( width: widget.size, height: widget.size, child: CircularProgressIndicator(), padding: EdgeInsets.all(8)); } else { var thumb = ImageLruCache.getData(entity); if (thumb != null) { leading = _buildImg(thumb); } else { leading = FutureBuilder( future: entity.thumbDataWithSize( widget.size.toInt(), widget.size.toInt()), builder: (BuildContext context, AsyncSnapshot snapshot) { var futureData = snapshot.data; if (snapshot.connectionState == ConnectionState.done && futureData != null) { ImageLruCache.setData(entity, widget.size.toInt(), futureData); return _buildImg(futureData); } else { return Center( child: Container( width: 30.0, height: 30.0, child: CircularProgressIndicator( valueColor: AlwaysStoppedAnimation(Colors.blueAccent), ), ), ); } }); } } return ListTile( leading: leading, title: Text(widget.pathEntity.name), subtitle: Text('${widget.pathEntity.assetCount}'), onTap:widget.onSelectFolder); } }