Hibok
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

130 line
3.8 KiB

  1. import 'package:chat/models/ChatMsg.dart';
  2. import 'package:chat/proto/all.pbserver.dart';
  3. import 'package:chat/utils/MessageMgr.dart';
  4. import 'package:chat/utils/screen.dart';
  5. import 'package:chat/utils/sql_util.dart';
  6. import 'package:chat/utils/upload_util.dart';
  7. import 'package:dio/dio.dart';
  8. import 'package:flutter/material.dart';
  9. import 'package:percent_indicator/percent_indicator.dart';
  10. class UploadImgItem extends StatefulWidget {
  11. final MsgModel msg;
  12. final Widget child;
  13. final bool isShowProgress;
  14. final CancelToken cancelToken;
  15. UploadImgItem(
  16. {this.msg, this.child, this.isShowProgress = true, this.cancelToken});
  17. @override
  18. _UploadItemState createState() => _UploadItemState();
  19. }
  20. class _UploadItemState extends State<UploadImgItem> {
  21. double percent = 0;
  22. @override
  23. void initState() {
  24. super.initState();
  25. MsgModel msg = widget.msg;
  26. if (msg.localFile != null && msg.state == MsgState.None) {
  27. //需要上传
  28. uploadImg();
  29. }
  30. MessageMgr().on('ReUpload Msg', reUpload);
  31. }
  32. @override
  33. void dispose() {
  34. MessageMgr().off('ReUpload Msg', reUpload);
  35. super.dispose();
  36. }
  37. reUpload(args) {
  38. if (args == widget.msg) {
  39. print('重新上传');
  40. uploadImg();
  41. }
  42. }
  43. uploadImg() async {
  44. if (widget.msg.state == MsgState.Uploading ||
  45. widget.msg.state == MsgState.Uploaded) {
  46. return;
  47. }
  48. widget.msg.state = MsgState.Uploading;
  49. await UploadUtil().uploadFile(widget.msg, cancelToken: widget.cancelToken);
  50. if (mounted) {
  51. this.setState(() {});
  52. }
  53. SqlUtil().updateMsgState(
  54. widget.msg.sessionId, widget.msg.time, widget.msg.state);
  55. }
  56. uploadWidget() {
  57. if (widget.msg.state == MsgState.Uploading && widget.isShowProgress) {
  58. return StreamBuilder(
  59. stream: UploadUtil().getStream(widget.msg.extraFile).stream,
  60. initialData: UploadUtil().streamLastPercentMap[widget.msg.extraFile],
  61. builder: (BuildContext context, AsyncSnapshot snapshot) {
  62. if (snapshot.data != null) {
  63. if (snapshot.data >= 1) {
  64. return SizedBox(width: 0, height: 0);
  65. }
  66. return CircularPercentIndicator(
  67. radius: 30.0,
  68. lineWidth: 2.0,
  69. percent: snapshot.data,
  70. center: Padding(
  71. padding: EdgeInsets.all(2),
  72. child: fixedText(
  73. "${(snapshot.data * 100).toStringAsFixed(0)}%",
  74. fontSize: 9,
  75. color: Colors.green)),
  76. progressColor: Colors.green,
  77. );
  78. } else {
  79. return SizedBox(width: 0, height: 0);
  80. }
  81. },
  82. );
  83. } else if (widget.msg.state == MsgState.UploadFailed) {
  84. //声音重传按钮叠加比较丑,和发送失败一起处理
  85. if (widget.msg.msgType == ChatType.ShortVoiceChatType.value) {
  86. return SizedBox(width: 0, height: 0);
  87. }
  88. return InkWell(
  89. onTap: uploadImg,
  90. child: Container(
  91. padding: EdgeInsets.all(5),
  92. decoration: BoxDecoration(
  93. color: Colors.grey.withAlpha(150),
  94. borderRadius: BorderRadius.circular(8)),
  95. child: Icon(Icons.rotate_right, color: Colors.white70),
  96. ),
  97. );
  98. } else if (widget.msg.msgType == ChatType.ShortVideoChatType.value &&
  99. widget.msg.state >= MsgState.Uploaded) {
  100. return Icon(Icons.play_circle_outline, color: Colors.white);
  101. } else {
  102. return SizedBox(width: 0, height: 0);
  103. }
  104. }
  105. @override
  106. Widget build(BuildContext context) {
  107. return Stack(
  108. alignment: Alignment.center,
  109. children: <Widget>[widget.child, uploadWidget()],
  110. );
  111. }
  112. }