import 'dart:io'; import 'dart:typed_data'; import 'package:chat/data/constants.dart'; import 'package:chat/generated/i18n.dart'; import 'package:chat/models/ChatMsg.dart'; import 'package:chat/r.dart'; import 'package:chat/utils/screen.dart'; import 'package:extended_image/extended_image.dart'; import 'package:flutter/material.dart'; import 'package:image_gallery_saver/image_gallery_saver.dart'; import 'package:oktoast/oktoast.dart'; class PhotoPage extends StatefulWidget { final MsgModel msg; PhotoPage({this.msg}); @override _PhotoPageState createState() => _PhotoPageState(); } class _PhotoPageState extends State with SingleTickerProviderStateMixin { AnimationController _controller; ImageProvider provider; @override void initState() { super.initState(); getImgData(); _controller = AnimationController(vsync: this); _controller.addListener(() { setState(() { }); }); } getImgData() { if (widget.msg.localFile != null) { var fileData = File(widget.msg.localFile).readAsBytesSync(); provider = MemoryImage(fileData); } else { provider = MemoryImage(Uint8List.fromList(widget.msg.msgContent)); } } @override void dispose() { _controller.stop(); _controller.dispose(); super.dispose(); } @override Widget build(BuildContext context) { Uint8List fileData; if (widget.msg.localFile != null) { fileData = File(widget.msg.localFile).readAsBytesSync(); // print('本地了${fileData.lengthInBytes}'); } else { fileData = Uint8List.fromList(widget.msg.msgContent); } return Material(color: Colors.black,child: GestureDetector( onTap: () { Navigator.pop(context); }, child: Container( width: Screen.width, height: Screen.height, alignment: Alignment.center, child: Stack( children: [ SingleChildScrollView( child: Column( children: [ Container( width: Screen.width, constraints: BoxConstraints(minHeight: Screen.height), child: ExtendedImage.memory( fileData, fit: BoxFit.fitWidth, mode: ExtendedImageMode.gesture, initGestureConfigHandler: (state) { return GestureConfig( minScale: 0.9, animationMinScale: 0.7, maxScale: 3.0, animationMaxScale: 3.5, speed: 1.0, inertialSpeed: 100.0, initialScale: 1.0, inPageView: true, initialAlignment: InitialAlignment.center, ); }, )) ], )), Positioned(bottom: 1,child: UnconstrainedBox(child: Container( width: Screen.width,height: 95,child: Image.asset(R.assetsImagesImgCheckPhotoBg,fit: BoxFit.fill,),),),), Positioned( right: 15, bottom: 15, child: Material(color: Colors.transparent,child: InkWell( onTap: saveToGallery, child: Container( width: 50, height: 50, padding: EdgeInsets.all(5), child: Icon( IconData(0xe680, fontFamily: Constants.IconFontFamily), color: Colors.white70,size: 40,), )),)) ], ))),); } saveToGallery() async { if (widget.msg.localFile != null) { var data = File(widget.msg.localFile).readAsBytesSync(); ImageGallerySaver.saveImage(data).then((res) { print(res); if (res != null) { showToast(I18n.of(context).successfully_saved); } }); } else { ImageGallerySaver.saveImage(Uint8List.fromList(widget.msg.msgContent)) .then((res) { print(res); if (res != null) { showToast(I18n.of(context).successfully_saved); } }); } } }