import 'package:chat/generated/i18n.dart'; import 'package:chat/photo/provider/asset_provider.dart'; import 'package:chat/photo/provider/config_provider.dart'; import 'package:chat/photo/ui/page/first_photo_item.dart'; import 'package:chat/utils/loading_builder.dart'; import 'package:chat/utils/screen.dart'; import 'package:flutter/material.dart'; import 'package:photo_manager/photo_manager.dart'; class PhotoSelectMenu extends StatefulWidget { final GlobalKey parentKey; final Function onSelectFolder; PhotoSelectMenu({this.parentKey, this.onSelectFolder}); @override _PhotoSelectMenuState createState() => _PhotoSelectMenuState(); } class _PhotoSelectMenuState extends State { AssetProvider get assetProvider => PhotoPickerProvider.of(context).assetProvider; OverlayEntry overlayEntry; bool isQuit = false; @override void dispose() { isQuit = true; clearOverlay(); super.dispose(); } @override Widget build(BuildContext context) { return InkWell( child: Container( child: Row(mainAxisSize: MainAxisSize.min, children: [ Text(assetProvider.current == null ? I18n.of(context).Photo_album : assetProvider.current.name), Icon( overlayEntry == null ? Icons.keyboard_arrow_down : Icons.keyboard_arrow_up, color: Color(0xFFB5B4B4), size: 20, ), ]), ), onTap: overlayEntry == null ? showAllFolders : clearOverlay); } void showAllFolders() { final RenderBox appBarBox = widget.parentKey.currentContext.findRenderObject(); overlayEntry = OverlayEntry( builder: (context) => Positioned( width: Screen.width, top: appBarBox.size.height, child: Material( elevation: 1, color: Colors.black26, child: Container( height: Screen.height, decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.only( bottomLeft: Radius.circular(10.0), bottomRight: Radius.circular(10.0))), child: FutureLoadingBuilder>( future: PhotoManager.getAssetPathList( type: RequestType.image), builder: (BuildContext context, List pathList) { return ListView( children: List.generate( pathList.length, (i) => FirstPhotoItem( pathEntity: pathList[i], onSelectFolder: () { widget.onSelectFolder(pathList[i]); clearOverlay(); }, ))); })), ))); Overlay.of(context).insert(overlayEntry); setState(() {}); } void clearOverlay() { if (overlayEntry != null) { overlayEntry.remove(); overlayEntry = null; if (!isQuit) { setState(() {}); } } } }