Hibok
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.
 
 
 
 
 
 

135 rader
4.2 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. } else {
  50. fileData = Uint8List.fromList(widget.msg.msgContent);
  51. }
  52. return GestureDetector(
  53. onTap: () {
  54. Navigator.pop(context);
  55. },
  56. child: Container(
  57. width: Screen.width,
  58. height: Screen.height,
  59. alignment: Alignment.center,
  60. child: Stack(
  61. children: <Widget>[
  62. SingleChildScrollView(
  63. child: Column(
  64. children: <Widget>[
  65. Container(
  66. width: Screen.width,
  67. constraints: BoxConstraints(minHeight: Screen.height),
  68. child: ExtendedImage.memory(
  69. fileData,
  70. fit: BoxFit.fitWidth,
  71. mode: ExtendedImageMode.gesture,
  72. initGestureConfigHandler: (state) {
  73. return GestureConfig(
  74. minScale: 0.9,
  75. animationMinScale: 0.7,
  76. maxScale: 3.0,
  77. animationMaxScale: 3.5,
  78. speed: 1.0,
  79. inertialSpeed: 100.0,
  80. initialScale: 1.0,
  81. inPageView: true,
  82. initialAlignment: InitialAlignment.center,
  83. );
  84. },
  85. ))
  86. ],
  87. )),
  88. Positioned(
  89. right: 10,
  90. bottom: 10,
  91. child: InkWell(
  92. onTap: saveToGallery,
  93. child: Container(
  94. padding: EdgeInsets.all(5),
  95. decoration: BoxDecoration(
  96. color: Colors.grey.withAlpha(150),
  97. borderRadius: BorderRadius.circular(8)),
  98. child: Icon(Icons.save_alt, color: Colors.white70),
  99. )))
  100. ],
  101. )));
  102. }
  103. saveToGallery() async {
  104. if (widget.msg.localFile != null) {
  105. var data = File(widget.msg.localFile).readAsBytesSync();
  106. ImageGallerySaver.saveImage(data).then((res) {
  107. print(res);
  108. if (res != null) {
  109. showToast(I18n.of(context).successfully_saved);
  110. }
  111. });
  112. } else {
  113. ImageGallerySaver.saveImage(Uint8List.fromList(widget.msg.msgContent))
  114. .then((res) {
  115. print(res);
  116. if (res != null) {
  117. showToast(I18n.of(context).successfully_saved);
  118. }
  119. });
  120. }
  121. }
  122. }