Flutter高仿微信系列共59篇,从Flutter客户端、Kotlin客户端、Web服务器、数据库表结构、Xmpp即时通讯服务器、视频通话服务器、腾讯云服务器全面讲解。
效果图:
详情请参考Flutter高仿微信-第44篇-群聊, 这里只是群聊的语音实现代码。
实现代码:
//我的语音 Widget meVoiceWidget(){ return InkWell( onTap: () { widget.clickVoiceCallback(true); setState(() { widget.chatBean.isPlayVoice = true; }); //点击语音 AudioPlayer.getInstance().playLocal(widget.chatBean.voiceLocal??"", callback: (data){ //录音回调 setState(() { widget.chatBean.isPlayVoice = false; }); }); }, child : Container( width: 120, height: 40, padding: EdgeInsets.symmetric(vertical: 4.0, horizontal: 2.0), decoration: BoxDecoration(borderRadius: BorderRadius.all(Radius.circular(1.0),),color: Color(0xFF9EEA6A),), child: Row( crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center, children: [ Text("${widget.chatBean.second}''"), SizedBox(width: 4,), widget.chatBean.isPlayVoice?Image.asset("assets/chat/wn_chat_me_animator.gif", height: 24,):Image.asset("assets/chat/wn_chat_me_volume_3.png", height: 24,), ], ), ) ); }
//朋友的语音 Widget toVoiceWidget(){ return InkWell( onTap: () { setState(() { widget.chatBean.isPlayVoice = true; }); LogUtils.d("点击语音"); AudioPlayer.getInstance().playLocal(widget.chatBean.voiceLocal??"", callback: (data){ LogUtils.d("录音回调:${data}"); setState(() { widget.chatBean.isPlayVoice = false; }); }); }, child : Container( width: 120, height: 40, padding: EdgeInsets.symmetric(vertical: 4.0, horizontal: 2.0), decoration: BoxDecoration(borderRadius: BorderRadius.all(Radius.circular(5.0),),color: Color(0xFFEDEDED)), child: Row( crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center, children: [ widget.chatBean.isPlayVoice?Image.asset("assets/chat/wn_chat_other_animator.gif", height: 34,):Image.asset("assets/chat/wn_chat_other_volume_3.png", height: 34,), SizedBox(width: 4,), Text("${widget.chatBean.second}''"), ], ), ) ); }
//刷新多媒体(图片、语音、小视频) (先刷新本地,然后小视频压缩完成再慢慢发送) void _refreshMedia(int type, String mediaURL, String thumbnailFileName, {int mediaSecond=0, String messageId = "" }) async { bool isNetwork = await CommonNetwork.isNetwork(); if(!isNetwork) { CommonUtils.showNetworkError(context); return; } String addTime = WnDateUtils.getCurrentTime(); //先刷新本地聊天 //ChatBean chatBean = ChatBean(fromAccount: widget.account, toAccount: widget.toGroupId,addTime:addTime,messageId: messageId,isRead: 1); GroupChatBean groupChatBean = GroupChatBean(account: widget.account, groupId: widget.toGroupId, addTime: addTime, messageId: messageId); LogUtils.d("群聊刷新:${type}"); groupChatBean.contentType = type; groupChatBean.localMediaUrl = mediaURL; groupChatBean.content = thumbnailFileName; groupChatBean.second = mediaSecond; if(type == CommonUtils.CHAT_CONTENT_TYPE_VOICE){ //状态变更,向聊天记录中插入新记录 setState(() { items.add(groupChatBean); }); await GroupChatRepository.getInstance().insertGroupChat(groupChatBean); } jumpToBottom(100); }
//发送多媒体(图片、语音、小视频) void _sendMedia(int type, String mediaURL, {int mediaSecond = 0, String messageId = ""}) async { bool isNetwork = await CommonNetwork.isNetwork(); if(!isNetwork) { return; } //上传文件 GroupChatBean? serverChatBean; String message = ""; String addTime = WnDateUtils.getCurrentTime(); ChatSendBean chatSendBean = ChatSendBean(); chatSendBean.fromAccount = SpUtils.getAccount(); chatSendBean.contentType = type; chatSendBean.messageId = messageId; chatSendBean.addTime = addTime; if(type == CommonUtils.CHAT_CONTENT_TYPE_VOICE){ //语音 serverChatBean = await UploadUtils.getInstance().uploadGroupChatVoice(widget.account, widget.toGroupId, mediaURL, messageId, addTime, mediaSecond); chatSendBean.second = mediaSecond; } chatSendBean.content = serverChatBean?.serverMediaUrl??""; GroupChatRepository.getInstance().updateGroupChatByMessageId(serverChatBean?.messageId??"", serverChatBean?.serverMediaUrl??""); message = jsonEncode(chatSendBean); _sendMessage(message); }