Hibok
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 
 
 

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