Hibok
25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

139 lines
4.4 KiB

  1. import 'dart:io';
  2. import 'dart:typed_data';
  3. import 'package:chat/generated/i18n.dart';
  4. import 'package:chat/models/ChatMsg.dart';
  5. import 'package:chat/utils/screen.dart';
  6. import 'package:extended_image/extended_image.dart';
  7. import 'package:flutter/material.dart';
  8. import 'package:image_gallery_saver/image_gallery_saver.dart';
  9. import 'package:oktoast/oktoast.dart';
  10. class PhotoPage extends StatefulWidget {
  11. final MsgModel msg;
  12. PhotoPage({this.msg});
  13. @override
  14. _PhotoPageState createState() => _PhotoPageState();
  15. }
  16. class _PhotoPageState extends State<PhotoPage>
  17. with SingleTickerProviderStateMixin {
  18. AnimationController _controller;
  19. ImageProvider provider;
  20. @override
  21. void initState() {
  22. super.initState();
  23. getImgData();
  24. _controller = AnimationController(vsync: this);
  25. _controller.addListener(() {
  26. setState(() {
  27. });
  28. });
  29. }
  30. getImgData() {
  31. if (widget.msg.localFile != null) {
  32. var fileData = File(widget.msg.localFile).readAsBytesSync();
  33. provider = MemoryImage(fileData);
  34. } else {
  35. provider = MemoryImage(Uint8List.fromList(widget.msg.msgContent));
  36. }
  37. }
  38. @override
  39. void dispose() {
  40. _controller.stop();
  41. _controller.dispose();
  42. super.dispose();
  43. }
  44. @override
  45. Widget build(BuildContext context) {
  46. Uint8List fileData;
  47. if (widget.msg.localFile != null) {
  48. fileData = File(widget.msg.localFile).readAsBytesSync();
  49. // print('本地了${fileData.lengthInBytes}');
  50. } else {
  51. fileData = Uint8List.fromList(widget.msg.msgContent);
  52. }
  53. return Material(color: Colors.black,child: GestureDetector(
  54. onTap: () {
  55. Navigator.pop(context);
  56. },
  57. child: Container(
  58. width: Screen.width,
  59. height: Screen.height,
  60. alignment: Alignment.center,
  61. child: Stack(
  62. children: <Widget>[
  63. SingleChildScrollView(
  64. child: Column(
  65. children: <Widget>[
  66. Container(
  67. width: Screen.width,
  68. constraints: BoxConstraints(minHeight: Screen.height),
  69. child: ExtendedImage.memory(
  70. fileData,
  71. fit: BoxFit.fitWidth,
  72. mode: ExtendedImageMode.gesture,
  73. initGestureConfigHandler: (state) {
  74. return GestureConfig(
  75. minScale: 0.9,
  76. animationMinScale: 0.7,
  77. maxScale: 3.0,
  78. animationMaxScale: 3.5,
  79. speed: 1.0,
  80. inertialSpeed: 100.0,
  81. initialScale: 1.0,
  82. inPageView: true,
  83. initialAlignment: InitialAlignment.center,
  84. );
  85. },
  86. ))
  87. ],
  88. )),
  89. Positioned(
  90. right: 10,
  91. bottom: 10,
  92. child: Material(child: InkWell(
  93. onTap: saveToGallery,
  94. child: Container(
  95. width: 50,
  96. height: 50,
  97. padding: EdgeInsets.all(5),
  98. decoration: BoxDecoration(
  99. color: Colors.grey.withAlpha(150),
  100. borderRadius: BorderRadius.circular(8)),
  101. child: Icon(Icons.save_alt, color: Colors.white70),
  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. }