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.
 
 
 
 
 
 

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