Hibok
您不能選擇超過 %s 個話題 話題必須以字母或數字為開頭,可包含連接號 ('-') 且最長為 35 個字
 
 
 
 
 
 

139 行
4.6 KiB

  1. import 'dart:io';
  2. import 'dart:typed_data';
  3. import 'package:chat/data/constants.dart';
  4. import 'package:chat/generated/i18n.dart';
  5. import 'package:chat/models/ChatMsg.dart';
  6. import 'package:chat/r.dart';
  7. import 'package:chat/utils/screen.dart';
  8. import 'package:extended_image/extended_image.dart';
  9. import 'package:flutter/material.dart';
  10. import 'package:image_gallery_saver/image_gallery_saver.dart';
  11. import 'package:oktoast/oktoast.dart';
  12. class PhotoPage extends StatefulWidget {
  13. final MsgModel msg;
  14. PhotoPage({this.msg});
  15. @override
  16. _PhotoPageState createState() => _PhotoPageState();
  17. }
  18. class _PhotoPageState extends State<PhotoPage>
  19. with SingleTickerProviderStateMixin {
  20. AnimationController _controller;
  21. ImageProvider provider;
  22. @override
  23. void initState() {
  24. super.initState();
  25. getImgData();
  26. _controller = AnimationController(vsync: this);
  27. _controller.addListener(() {
  28. setState(() {
  29. });
  30. });
  31. }
  32. getImgData() {
  33. if (widget.msg.localFile != null) {
  34. var fileData = File(widget.msg.localFile).readAsBytesSync();
  35. provider = MemoryImage(fileData);
  36. } else {
  37. provider = MemoryImage(Uint8List.fromList(widget.msg.msgContent));
  38. }
  39. }
  40. @override
  41. void dispose() {
  42. _controller.stop();
  43. _controller.dispose();
  44. super.dispose();
  45. }
  46. @override
  47. Widget build(BuildContext context) {
  48. Uint8List fileData;
  49. if (widget.msg.localFile != null) {
  50. fileData = File(widget.msg.localFile).readAsBytesSync();
  51. // print('本地了${fileData.lengthInBytes}');
  52. } else {
  53. fileData = Uint8List.fromList(widget.msg.msgContent);
  54. }
  55. return Material(color: Colors.black,child: GestureDetector(
  56. onTap: () {
  57. Navigator.pop(context);
  58. },
  59. child: Container(
  60. width: Screen.width,
  61. height: Screen.height,
  62. alignment: Alignment.center,
  63. child: Stack(
  64. children: <Widget>[
  65. SingleChildScrollView(
  66. child: Column(
  67. children: <Widget>[
  68. Container(
  69. width: Screen.width,
  70. constraints: BoxConstraints(minHeight: Screen.height),
  71. child: ExtendedImage.memory(
  72. fileData,
  73. fit: BoxFit.fitWidth,
  74. mode: ExtendedImageMode.gesture,
  75. initGestureConfigHandler: (state) {
  76. return GestureConfig(
  77. minScale: 0.9,
  78. animationMinScale: 0.7,
  79. maxScale: 3.0,
  80. animationMaxScale: 3.5,
  81. speed: 1.0,
  82. inertialSpeed: 100.0,
  83. initialScale: 1.0,
  84. inPageView: true,
  85. initialAlignment: InitialAlignment.center,
  86. );
  87. },
  88. ))
  89. ],
  90. )),
  91. Positioned(bottom: 1,child: UnconstrainedBox(child: Container( width: Screen.width,height: 95,child: Image.asset(R.assetsImagesImgCheckPhotoBg,fit: BoxFit.fill,),),),),
  92. Positioned(
  93. right: 15,
  94. bottom: 15,
  95. child: Material(color: Colors.transparent,child: InkWell(
  96. onTap: saveToGallery,
  97. child: Container(
  98. width: 50,
  99. height: 50,
  100. padding: EdgeInsets.all(5),
  101. child: Icon( IconData(0xe680, fontFamily: Constants.IconFontFamily), color: Colors.white70,size: 40,),
  102. )),))
  103. ],
  104. ))),);
  105. }
  106. saveToGallery() async {
  107. if (widget.msg.localFile != null) {
  108. var data = File(widget.msg.localFile).readAsBytesSync();
  109. ImageGallerySaver.saveImage(data).then((res) {
  110. print(res);
  111. if (res != null) {
  112. showToast(I18n.of(context).successfully_saved);
  113. }
  114. });
  115. } else {
  116. ImageGallerySaver.saveImage(Uint8List.fromList(widget.msg.msgContent))
  117. .then((res) {
  118. print(res);
  119. if (res != null) {
  120. showToast(I18n.of(context).successfully_saved);
  121. }
  122. });
  123. }
  124. }
  125. }