import 'package:chat/models/ChatMsg.dart'; import 'package:chat/proto/all.pbserver.dart'; import 'package:chat/utils/MessageMgr.dart'; import 'package:chat/utils/screen.dart'; import 'package:chat/utils/sql_util.dart'; import 'package:chat/utils/upload_util.dart'; import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; import 'package:percent_indicator/percent_indicator.dart'; class UploadImgItem extends StatefulWidget { final MsgModel msg; final Widget child; final bool isShowProgress; UploadImgItem( {this.msg, this.child, this.isShowProgress = true}); @override _UploadItemState createState() => _UploadItemState(); } class _UploadItemState extends State { double percent = 0; @override void initState() { super.initState(); MsgModel msg = widget.msg; if (msg.localFile != null && msg.state == MsgState.None) { //需要上传 uploadImg(); } MessageMgr().on('ReUpload Msg', reUpload); } @override void dispose() { MessageMgr().off('ReUpload Msg', reUpload); super.dispose(); } reUpload(args) { if (args == widget.msg) { print('重新上传'); uploadImg(); } } uploadImg() async { if (widget.msg.state == MsgState.Uploading || widget.msg.state == MsgState.Uploaded) { return; } widget.msg.state = MsgState.Uploading; await UploadUtil().uploadFile(widget.msg); if (mounted) { this.setState(() {}); } SqlUtil().updateMsgState( widget.msg.sessionId, widget.msg.time, widget.msg.state); } uploadWidget() { if (widget.msg.state == MsgState.Uploading && widget.isShowProgress) { return StreamBuilder( stream: UploadUtil().getStream(widget.msg.extraFile).stream, initialData: UploadUtil().streamLastPercentMap[widget.msg.extraFile], builder: (BuildContext context, AsyncSnapshot snapshot) { if (snapshot.data != null) { if (snapshot.data >= 1) { return SizedBox(width: 0, height: 0); } return CircularPercentIndicator( radius: 30.0, lineWidth: 2.0, percent: snapshot.data, center: Padding( padding: EdgeInsets.all(2), child: fixedText( "${(snapshot.data * 100).toStringAsFixed(0)}%", fontSize: 9, color: Colors.green)), progressColor: Colors.green, ); } else { return SizedBox(width: 0, height: 0); } }, ); } else if (widget.msg.state == MsgState.UploadFailed) { //声音重传按钮叠加比较丑,和发送失败一起处理 if (widget.msg.msgType == ChatType.ShortVoiceChatType.value) { return SizedBox(width: 0, height: 0); } return InkWell( onTap: uploadImg, child: Container( padding: EdgeInsets.all(5), decoration: BoxDecoration( color: Colors.grey.withAlpha(150), borderRadius: BorderRadius.circular(8)), child: Icon(Icons.rotate_right, color: Colors.white70), ), ); } else if (widget.msg.msgType == ChatType.ShortVideoChatType.value && widget.msg.state >= MsgState.Uploaded) { return Icon(Icons.play_circle_outline, color: Colors.white); } else { return SizedBox(width: 0, height: 0); } } @override Widget build(BuildContext context) { return Stack( alignment: Alignment.center, children: [widget.child, uploadWidget()], ); } }