# Conflicts: # ios/Flutter/flutter_export_environment.sh # lib/chat/ChatPageItem.dart # lib/chat/group_chat_item.dart # lib/home/AddProgram.dart # lib/home/InformUser.dart # lib/utils/HttpUtil.dart # lib/utils/msgHandler.dartmaster
@@ -56,9 +56,9 @@ android { | |||||
// manifestPlaceholders = [ | // manifestPlaceholders = [ | ||||
// AMAP_KEY : "1fd4e93e3b4b13747da41f484c955fe2", /// 高德地图key | // AMAP_KEY : "1fd4e93e3b4b13747da41f484c955fe2", /// 高德地图key | ||||
// ] | // ] | ||||
// ndk { | |||||
// abiFilters 'armeabi-v7a' | |||||
// } | |||||
// ndk { | |||||
// abiFilters 'armeabi-v7a' | |||||
// } | |||||
multiDexEnabled true | multiDexEnabled true | ||||
manifestPlaceholders = [ | manifestPlaceholders = [ | ||||
JPUSH_PKGNAME : 'com.cyhd.henhoandroid', | JPUSH_PKGNAME : 'com.cyhd.henhoandroid', | ||||
@@ -405,7 +405,7 @@ | |||||
"opened_reminder": "메시지를 켜다 성공", | "opened_reminder": "메시지를 켜다 성공", | ||||
"her_account": "그녀의 사교 아이디", | "her_account": "그녀의 사교 아이디", | ||||
"his_account": "그의 사교 아이디", | "his_account": "그의 사교 아이디", | ||||
"copy": "복제", | |||||
"copy": "복사", | |||||
"send_account": "내 사교 아이디를 보내기", | "send_account": "내 사교 아이디를 보내기", | ||||
"enter_account": "당신의 사교 아이디 입력하세요", | "enter_account": "당신의 사교 아이디 입력하세요", | ||||
"for_example": "예하면:Wechat 아이다 abc", | "for_example": "예하면:Wechat 아이다 abc", | ||||
@@ -525,8 +525,8 @@ | |||||
"issue_choose": "초청 번호는 무료입니다. 우리는 당신의 역사적 소비에 따라 초청번호를 발송할지 평가할 것입니다.공원의 분위기를 유지하기 위해서 꼭 초청번호를 믿고 믿을 만한 친구에게 증정해 주십시오", | "issue_choose": "초청 번호는 무료입니다. 우리는 당신의 역사적 소비에 따라 초청번호를 발송할지 평가할 것입니다.공원의 분위기를 유지하기 위해서 꼭 초청번호를 믿고 믿을 만한 친구에게 증정해 주십시오", | ||||
"successfully_submit": "신청을 성공 제출했다", | "successfully_submit": "신청을 성공 제출했다", | ||||
"share_app": "앱을 친구에게 공유하다", | "share_app": "앱을 친구에게 공유하다", | ||||
"need_help": "질문이 있으니까 도움이 필요하다", | |||||
"need_help2": "고객을 연락하다", | |||||
"need_help": "질문&도움", | |||||
"need_help2": "고객센터", | |||||
"need_help3": "서비스 효율을 높이기 위해서 아래에 문제가 있으면 숫자를 바로 답장하십시오!", | "need_help3": "서비스 효율을 높이기 위해서 아래에 문제가 있으면 숫자를 바로 답장하십시오!", | ||||
"question1": "【1】아이디 동결된 이유는 무엇입니까 ?", | "question1": "【1】아이디 동결된 이유는 무엇입니까 ?", | ||||
"answer1": " 아래 여러 상황이 나타나면 아이다가 동결될 수 있다 :① 사기꾼 ② 중개 ③ 소란 광고 ④ 많은 사람들이 신고하다 ⑤ 이미 기타 아이디 있다 ⑥ 여러번 위반 방송국 방송의 경고를 무시했다 ⑦ 사용자 스스로 취소 요구", | "answer1": " 아래 여러 상황이 나타나면 아이다가 동결될 수 있다 :① 사기꾼 ② 중개 ③ 소란 광고 ④ 많은 사람들이 신고하다 ⑤ 이미 기타 아이디 있다 ⑥ 여러번 위반 방송국 방송의 경고를 무시했다 ⑦ 사용자 스스로 취소 요구", | ||||
@@ -211,7 +211,6 @@ class _ChatPageItemState extends State<ChatPageItem> | |||||
} | } | ||||
_msgWidget() { | _msgWidget() { | ||||
if (widget.msg.from == 0) { | if (widget.msg.from == 0) { | ||||
return _serverNotifyMsg(); | return _serverNotifyMsg(); | ||||
} else { | } else { | ||||
@@ -295,8 +294,7 @@ class _ChatPageItemState extends State<ChatPageItem> | |||||
// } | // } | ||||
} | |||||
} | } | ||||
return Container(); | return Container(); | ||||
} | } | ||||
@@ -822,16 +820,29 @@ class _ChatPageItemState extends State<ChatPageItem> | |||||
isUrl =true; | isUrl =true; | ||||
} | } | ||||
showMsg.add(Container( | |||||
constraints: | |||||
BoxConstraints(maxWidth: Screen.width - 140, minHeight: 24), | |||||
alignment: Alignment.centerLeft, | |||||
child: extendedText( | |||||
textList[curTextType], | |||||
color: isUrl?Colors.blue:Constants.BlackTextColor, | |||||
hideKeyboard: widget.hideKeyboard, | |||||
fontSize: FontSize, | |||||
))); | |||||
showMsg.add(InkWell( | |||||
onTap: () { | |||||
if (msg.transTag == 1) { | |||||
return; | |||||
} | |||||
if (msg.transTag == 2 || msg.transTag == 3) { | |||||
setState(() { | |||||
curTextType += 1; | |||||
curTextType %= textList.length; | |||||
}); | |||||
return; | |||||
} | |||||
}, | |||||
child: Container( | |||||
constraints: | |||||
BoxConstraints(maxWidth: Screen.width - 140, minHeight: 22), | |||||
alignment: Alignment.centerLeft, | |||||
child: extendedText( | |||||
textList[curTextType], | |||||
color: isUrl ? Colors.blue : Constants.BlackTextColor, | |||||
hideKeyboard: widget.hideKeyboard, | |||||
fontSize: FontSize, | |||||
)))); | |||||
} | } | ||||
var width = _getTextWidth(textList[curTextType]); | var width = _getTextWidth(textList[curTextType]); | ||||
@@ -847,18 +858,32 @@ class _ChatPageItemState extends State<ChatPageItem> | |||||
} | } | ||||
///todo | ///todo | ||||
Widget text = Container( | |||||
width: width + 20, | |||||
constraints: | |||||
BoxConstraints(maxWidth: Screen.width - 120, minWidth: minWidth), | |||||
padding: EdgeInsets.symmetric(horizontal: 9, vertical: 10.5), | |||||
child: Column( | |||||
crossAxisAlignment: CrossAxisAlignment.start, children: showMsg), | |||||
decoration: BoxDecoration( | |||||
border: Border.all(color: ReciveBorderColor, width: 0.5), | |||||
color: isLongPressed ? Colors.grey[300] : Colors.white, | |||||
borderRadius: BorderRadius.all(Radius.circular(ChatRadius))), | |||||
); | |||||
Widget text = Stack(children: <Widget>[ | |||||
Container( | |||||
width: width + 20, | |||||
constraints: | |||||
BoxConstraints(maxWidth: Screen.width - 120, minWidth: minWidth), | |||||
padding: EdgeInsets.symmetric(horizontal: 9, vertical: 10.5), | |||||
child: Column( | |||||
crossAxisAlignment: CrossAxisAlignment.start, children: showMsg), | |||||
decoration: BoxDecoration( | |||||
border: Border.all(color: ReciveBorderColor, width: 0.5), | |||||
color: isLongPressed ? Colors.grey[300] : Colors.white, | |||||
borderRadius: BorderRadius.all(Radius.circular(ChatRadius))), | |||||
), | |||||
msg.transTag != 1 | |||||
? Positioned( | |||||
right: 5, | |||||
top: 5, | |||||
child: Container( | |||||
child: Row(children: <Widget>[ | |||||
blueDot(curTextType == 0), | |||||
blueDot(curTextType == 1), | |||||
blueDot(curTextType == 2), | |||||
//blueDot(true), | |||||
]))) | |||||
: Container() | |||||
]); | |||||
if (msg.refMsgContent != null && msg.refMsgContent.length > 0) { | if (msg.refMsgContent != null && msg.refMsgContent.length > 0) { | ||||
QuoteMsg quoteMsg = QuoteMsg.fromBuffer(msg.refMsgContent); | QuoteMsg quoteMsg = QuoteMsg.fromBuffer(msg.refMsgContent); | ||||
@@ -1070,7 +1095,7 @@ class _ChatPageItemState extends State<ChatPageItem> | |||||
isAutoDown: false, | isAutoDown: false, | ||||
msg: widget.msg, | msg: widget.msg, | ||||
onFinishTap: (){ | onFinishTap: (){ | ||||
widget.hideKeyboard(); | |||||
showFullImg(context, widget.msg); | showFullImg(context, widget.msg); | ||||
}, | }, | ||||
child: Container( | child: Container( | ||||
@@ -1319,13 +1344,24 @@ class _ChatPageItemState extends State<ChatPageItem> | |||||
void showFullImg(BuildContext context, MsgModel msg) { | void showFullImg(BuildContext context, MsgModel msg) { | ||||
print('显示图片'); | print('显示图片'); | ||||
widget.hideKeyboard(); | |||||
Navigator.push(context, | Navigator.push(context, | ||||
MaterialPageRoute<void>(builder: (BuildContext context) { | MaterialPageRoute<void>(builder: (BuildContext context) { | ||||
return PhotoPage(msg: msg); | return PhotoPage(msg: msg); | ||||
})); | })); | ||||
} | } | ||||
blueDot(bool isShow) { | |||||
return Container( | |||||
margin: EdgeInsets.only(right: 5), | |||||
decoration: BoxDecoration( | |||||
shape: BoxShape.circle, | |||||
color: isShow ? Color(0xFFFF7E00) : Color(0xFFCFCFCF), | |||||
), | |||||
width: 6, | |||||
height: 6, | |||||
); | |||||
} | |||||
_reveiveMsg(BuildContext context) { | _reveiveMsg(BuildContext context) { | ||||
Widget item; | Widget item; | ||||
switch (ChatType.valueOf(widget.msg.msgType)) { | switch (ChatType.valueOf(widget.msg.msgType)) { | ||||
@@ -771,6 +771,18 @@ class _GroupChatPageItemState extends State<GroupChatPageItem> | |||||
///单文字 | ///单文字 | ||||
} | } | ||||
blueDot(bool isShow) { | |||||
return Container( | |||||
margin: EdgeInsets.only(right: 5), | |||||
decoration: BoxDecoration( | |||||
shape: BoxShape.circle, | |||||
color: isShow ? Color(0xFFFF7E00) : Color(0xFFCFCFCF), | |||||
), | |||||
width: 6, | |||||
height: 6, | |||||
); | |||||
} | |||||
_receiveText(MsgModel msg) { | _receiveText(MsgModel msg) { | ||||
List<Widget> showMsg = []; | List<Widget> showMsg = []; | ||||
if (textList.length > 0) { | if (textList.length > 0) { | ||||
@@ -779,19 +791,29 @@ class _GroupChatPageItemState extends State<GroupChatPageItem> | |||||
isUrl =true; | isUrl =true; | ||||
} | } | ||||
showMsg.add(Container( | |||||
constraints: | |||||
BoxConstraints(maxWidth: Screen.width - 140, minHeight: 22), | |||||
alignment: Alignment.centerLeft, | |||||
child: extendedText( | |||||
textList[curTextType], | |||||
color: isUrl?Colors.blue:Constants.BlackTextColor, | |||||
hideKeyboard: widget.hideKeyboard, | |||||
fontSize: FontSize, | |||||
))); | |||||
showMsg.add(InkWell( | |||||
onTap: () { | |||||
if (msg.transTag == 1) { | |||||
return; | |||||
} | |||||
if (msg.transTag == 2 || msg.transTag == 3) { | |||||
setState(() { | |||||
curTextType += 1; | |||||
curTextType %= textList.length; | |||||
}); | |||||
return; | |||||
} | |||||
}, | |||||
child: Container( | |||||
constraints: | |||||
BoxConstraints(maxWidth: Screen.width - 140, minHeight: 22), | |||||
alignment: Alignment.centerLeft, | |||||
child: extendedText( | |||||
textList[curTextType], | |||||
color: isUrl ? Colors.blue : Constants.BlackTextColor, | |||||
hideKeyboard: widget.hideKeyboard, | |||||
fontSize: FontSize, | |||||
)))); | |||||
} | } | ||||
var width = _getTextWidth(textList[curTextType]); | var width = _getTextWidth(textList[curTextType]); | ||||
@@ -806,18 +828,32 @@ class _GroupChatPageItemState extends State<GroupChatPageItem> | |||||
showMsg.add(tranWidget); | showMsg.add(tranWidget); | ||||
} | } | ||||
Widget text = Container( | |||||
width: width + 20, | |||||
constraints: | |||||
BoxConstraints(maxWidth: Screen.width - 120, minWidth: minWidth), | |||||
padding: EdgeInsets.symmetric(horizontal: 9, vertical: 10.5), | |||||
child: Column( | |||||
crossAxisAlignment: CrossAxisAlignment.start, children: showMsg), | |||||
decoration: BoxDecoration( | |||||
border: Border.all(color: ReciveBorderColor, width: 0.5), | |||||
color: isLongPressed ? Colors.grey[300] : Colors.white, | |||||
borderRadius: BorderRadius.all(Radius.circular(ChatRadius))), | |||||
); | |||||
Widget text = Stack(children: <Widget>[ | |||||
Container( | |||||
width: width + 20, | |||||
constraints: | |||||
BoxConstraints(maxWidth: Screen.width - 120, minWidth: minWidth), | |||||
padding: EdgeInsets.symmetric(horizontal: 9, vertical: 10.5), | |||||
child: Column( | |||||
crossAxisAlignment: CrossAxisAlignment.start, children: showMsg), | |||||
decoration: BoxDecoration( | |||||
border: Border.all(color: ReciveBorderColor, width: 0.5), | |||||
color: isLongPressed ? Colors.grey[300] : Colors.white, | |||||
borderRadius: BorderRadius.all(Radius.circular(ChatRadius))), | |||||
), | |||||
msg.transTag != 1 && msg.transTag !=0 | |||||
? Positioned( | |||||
right: 5, | |||||
top: 5, | |||||
child: Container( | |||||
child: Row(children: <Widget>[ | |||||
blueDot(curTextType == 0), | |||||
blueDot(curTextType == 1), | |||||
blueDot(curTextType == 2), | |||||
//blueDot(true), | |||||
]))) | |||||
: Container() | |||||
]); | |||||
if (msg.refMsgContent != null && msg.refMsgContent.length > 0) { | if (msg.refMsgContent != null && msg.refMsgContent.length > 0) { | ||||
QuoteMsg quoteMsg = QuoteMsg.fromBuffer(msg.refMsgContent); | QuoteMsg quoteMsg = QuoteMsg.fromBuffer(msg.refMsgContent); | ||||
@@ -1055,6 +1091,7 @@ class _GroupChatPageItemState extends State<GroupChatPageItem> | |||||
isAutoDown: false, | isAutoDown: false, | ||||
msg: widget.msg, | msg: widget.msg, | ||||
onFinishTap: (){ | onFinishTap: (){ | ||||
widget.hideKeyboard(); | |||||
showFullImg(context, widget.msg); | showFullImg(context, widget.msg); | ||||
}, | }, | ||||
child: Container( | child: Container( | ||||
@@ -1285,9 +1322,6 @@ class _GroupChatPageItemState extends State<GroupChatPageItem> | |||||
void showFullImg(BuildContext context, MsgModel msg) { | void showFullImg(BuildContext context, MsgModel msg) { | ||||
print('显示图片'); | print('显示图片'); | ||||
if( widget.hideKeyboard!=null){ | |||||
widget.hideKeyboard(); | |||||
} | |||||
Navigator.push(context, | Navigator.push(context, | ||||
MaterialPageRoute<void>(builder: (BuildContext context) { | MaterialPageRoute<void>(builder: (BuildContext context) { | ||||
return PhotoPage(msg: msg); | return PhotoPage(msg: msg); | ||||
@@ -29,6 +29,7 @@ import 'package:flutter/cupertino.dart'; | |||||
import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||
import 'package:oktoast/oktoast.dart'; | import 'package:oktoast/oktoast.dart'; | ||||
import 'package:provider/provider.dart'; | import 'package:provider/provider.dart'; | ||||
import 'package:scrollable_positioned_list/scrollable_positioned_list.dart'; | |||||
import '../r.dart'; | import '../r.dart'; | ||||
import 'input_bar.dart'; | import 'input_bar.dart'; | ||||
import 'package:chat/models/ref_name_provider.dart'; | import 'package:chat/models/ref_name_provider.dart'; | ||||
@@ -46,7 +47,9 @@ class GroupChatPage extends StatefulWidget { | |||||
} | } | ||||
class _GroupChatPageState extends State<GroupChatPage> { | class _GroupChatPageState extends State<GroupChatPage> { | ||||
ScrollController _scrollCtrl = ScrollController(); | |||||
final ItemScrollController itemScrollController = ItemScrollController(); | |||||
final ItemPositionsListener itemPositionListener = | |||||
ItemPositionsListener.create(); | |||||
MessageMgr msgMgr = MessageMgr(); | MessageMgr msgMgr = MessageMgr(); | ||||
@@ -62,6 +65,16 @@ class _GroupChatPageState extends State<GroupChatPage> { | |||||
//子元素的对应偏移量 | //子元素的对应偏移量 | ||||
Map itemOffsetMap = {}; | Map itemOffsetMap = {}; | ||||
//未读消息数目 | |||||
int unreadNums = 0; | |||||
//最上一条未读消息id | |||||
int unreadTime; | |||||
//@消息索引 | |||||
int alterTime; | |||||
String alterUserName = ''; | |||||
@override | @override | ||||
void dispose() { | void dispose() { | ||||
var endTime = DateTime.now().millisecondsSinceEpoch ~/ 1000; | var endTime = DateTime.now().millisecondsSinceEpoch ~/ 1000; | ||||
@@ -73,7 +86,6 @@ class _GroupChatPageState extends State<GroupChatPage> { | |||||
msgMgr.off('Delete Select Message', _deleteItem); | msgMgr.off('Delete Select Message', _deleteItem); | ||||
MsgHandler.curActiveSession = 0; | MsgHandler.curActiveSession = 0; | ||||
SoundUtils().stop(); | SoundUtils().stop(); | ||||
_scrollCtrl.dispose(); | |||||
super.dispose(); | super.dispose(); | ||||
} | } | ||||
@@ -86,14 +98,28 @@ class _GroupChatPageState extends State<GroupChatPage> { | |||||
getDefaultSetting(); | getDefaultSetting(); | ||||
startTime = DateTime.now().millisecondsSinceEpoch ~/ 1000; | startTime = DateTime.now().millisecondsSinceEpoch ~/ 1000; | ||||
unreadNums = ChatDataMgr() | |||||
.groupUnreadProvider | |||||
.getUnreadCount(widget.groupInfoModel.sessionId); | |||||
alterTime = ChatDataMgr() | |||||
.groupUnreadProvider | |||||
.getHavaAltertime(widget.groupInfoModel.sessionId); | |||||
MsgHandler.updateActiveSesstion(widget.groupInfoModel.sessionId, | MsgHandler.updateActiveSesstion(widget.groupInfoModel.sessionId, | ||||
isGroup: true); | isGroup: true); | ||||
msgList = ChatDataMgr().getGroupRecord(); | msgList = ChatDataMgr().getGroupRecord(); | ||||
for (int k = 0; k < msgList.length; k++) { | |||||
MsgModel msg = msgList[k]; | |||||
print('msgList ${msg.msgType} ${msg.from}'); | |||||
if (unreadNums >= 10) { | |||||
unreadTime = msgList[unreadNums - 1].time; | |||||
} | |||||
for (int i = 0; i < msgList.length; i++) { | |||||
if (msgList[i].time == alterTime) { | |||||
alterUserName = | |||||
widget.groupInfoModel.getMember(msgList[i].friendId).nickName; | |||||
break; | |||||
} | |||||
} | } | ||||
msgMgr.on('New Chat Message', receiveMsg); | msgMgr.on('New Chat Message', receiveMsg); | ||||
@@ -112,11 +138,14 @@ class _GroupChatPageState extends State<GroupChatPage> { | |||||
ChatType.valueOf(originMsg.msgType), originMsg.msgContent, | ChatType.valueOf(originMsg.msgType), originMsg.msgContent, | ||||
channelType: ChatChannelType.Group); | channelType: ChatChannelType.Group); | ||||
msg.extraInfo = originMsg.extraInfo; | msg.extraInfo = originMsg.extraInfo; | ||||
// msg.extraFile = originMsg.extraFile; | // msg.extraFile = originMsg.extraFile; | ||||
if(originMsg.extraFile==null ||originMsg.extraFile.contains('http')){ | |||||
if (originMsg.extraFile == null || | |||||
originMsg.extraFile.contains('http')) { | |||||
msg.extraFile = originMsg.extraFile; | msg.extraFile = originMsg.extraFile; | ||||
}else{ | |||||
msg.extraFile = UploadUtil().getFullUrl(originMsg.extraFile, originMsg.sessionId, originMsg.channelType); | |||||
} else { | |||||
msg.extraFile = UploadUtil().getFullUrl( | |||||
originMsg.extraFile, originMsg.sessionId, originMsg.channelType); | |||||
} | } | ||||
msg.localFile = originMsg.localFile; | msg.localFile = originMsg.localFile; | ||||
if (msg.localFile != null) { | if (msg.localFile != null) { | ||||
@@ -224,6 +253,9 @@ class _GroupChatPageState extends State<GroupChatPage> { | |||||
Map refMap = Provider.of<RefNameProvider>(context).refMap; | Map refMap = Provider.of<RefNameProvider>(context).refMap; | ||||
bool isHaveUnreadNews = unreadTime !=null; | |||||
bool isAlterYou = alterTime != null; | |||||
return MultiProvider( | return MultiProvider( | ||||
providers: [ | providers: [ | ||||
ChangeNotifierProvider(create: (_) => _keyboardIndexProvider), | ChangeNotifierProvider(create: (_) => _keyboardIndexProvider), | ||||
@@ -254,14 +286,86 @@ class _GroupChatPageState extends State<GroupChatPage> { | |||||
centerTitle: false, | centerTitle: false, | ||||
actions: actions), | actions: actions), | ||||
body: SafeArea( | body: SafeArea( | ||||
child: Column( | |||||
child: Stack( | |||||
children: <Widget>[ | children: <Widget>[ | ||||
NetStateWidget(), | |||||
Expanded(child: _buildMessageList()), | |||||
InputBar(sendMsg: sendMsg), | |||||
Column( | |||||
children: <Widget>[ | |||||
NetStateWidget(), | |||||
Expanded(child: _buildMessageList()), | |||||
InputBar(sendMsg: sendMsg), | |||||
], | |||||
), | |||||
isHaveUnreadNews | |||||
? Positioned( | |||||
top: 32.5, | |||||
right: 0, | |||||
child: InkWell( | |||||
onTap: () { | |||||
var screenItemNums = | |||||
itemPositionListener | |||||
.itemPositions.value.length; | |||||
int jumIndex = 0; | |||||
if (isAlterYou) { | |||||
for (int i = 0; | |||||
i < msgList.length; | |||||
i++) { | |||||
if (alterTime == msgList[i].time) { | |||||
jumIndex = i - screenItemNums + 2; | |||||
break; | |||||
} | |||||
} | |||||
} else { | |||||
for (int i = 0; | |||||
i < msgList.length; | |||||
i++) { | |||||
if (unreadTime == msgList[i].time) { | |||||
jumIndex = i - screenItemNums + 2; | |||||
break; | |||||
} | |||||
} | |||||
} | |||||
itemScrollController.jumpTo( | |||||
index: jumIndex); | |||||
unreadTime = null; | |||||
setState(() {}); | |||||
}, | |||||
child: Container( | |||||
alignment: Alignment.center, | |||||
decoration: BoxDecoration( | |||||
boxShadow: [ | |||||
BoxShadow( | |||||
color: Color(0x33000000), //阴影颜色 | |||||
blurRadius: 10.0, //阴影大小 | |||||
) | |||||
], | |||||
borderRadius: BorderRadius.only( | |||||
topLeft: Radius.circular(80), | |||||
bottomLeft: Radius.circular(80)), | |||||
color: Colors.white, | |||||
), | |||||
constraints: | |||||
BoxConstraints(minWidth: 120), | |||||
height: 39, | |||||
child: Row( | |||||
children: <Widget>[ | |||||
Icon( | |||||
Icons.file_upload, | |||||
color: Color(0xFF3875E9), | |||||
size: 20, | |||||
), | |||||
Text( | |||||
isAlterYou | |||||
? '$alterUserName @你' | |||||
: '$unreadNums条新消息', | |||||
style: TextStyle( | |||||
color: Color(0xFF3875E9)), | |||||
) | |||||
], | |||||
), | |||||
))) | |||||
: Container() | |||||
], | ], | ||||
))), | ))), | ||||
behavior: HitTestBehavior.translucent, | |||||
onPointerDown: (value) { | onPointerDown: (value) { | ||||
for (var state in states) { | for (var state in states) { | ||||
if (!state.containsPosition(value.position)) { | if (!state.containsPosition(value.position)) { | ||||
@@ -295,13 +399,13 @@ class _GroupChatPageState extends State<GroupChatPage> { | |||||
for (var i = 0; i < msgList.length; i++) { | for (var i = 0; i < msgList.length; i++) { | ||||
MsgModel msg = msgList[i]; | MsgModel msg = msgList[i]; | ||||
double itemHeight = 40; | |||||
double itemHeight = 70; | |||||
switch (ChatType.valueOf(msg.msgType)) { | switch (ChatType.valueOf(msg.msgType)) { | ||||
case ChatType.TextChatType: | case ChatType.TextChatType: | ||||
if (msg.from == myId) { | |||||
var text = utf8.decode(msg.msgContent); | |||||
itemHeight = 21 + _getTextHeight(text); | |||||
} else {} | |||||
//if (msg.from == myId) { | |||||
var text = utf8.decode(msg.msgContent); | |||||
itemHeight = 21 + _getTextHeight(text); | |||||
//} else {} | |||||
break; | break; | ||||
case ChatType.ShortVoiceChatType: | case ChatType.ShortVoiceChatType: | ||||
if (msg.from == myId) { | if (msg.from == myId) { | ||||
@@ -383,13 +487,15 @@ class _GroupChatPageState extends State<GroupChatPage> { | |||||
style: TextStyle(color: Colors.grey), | style: TextStyle(color: Colors.grey), | ||||
)) | )) | ||||
: Scrollbar( | : Scrollbar( | ||||
child: ListView.builder( | |||||
reverse: true, | |||||
shrinkWrap: true, | |||||
child: ScrollablePositionedList.builder( | |||||
physics: new ClampingScrollPhysics(), | |||||
itemCount: msgList.length, | itemCount: msgList.length, | ||||
controller: _scrollCtrl, | |||||
padding: EdgeInsets.all(8.0), | |||||
itemBuilder: _buildItem, | itemBuilder: _buildItem, | ||||
itemScrollController: itemScrollController, | |||||
itemPositionsListener: itemPositionListener, | |||||
padding: EdgeInsets.all(8.0), | |||||
reverse: true, | |||||
hitCallback: hideKeyBoard, | |||||
)), | )), | ||||
); | ); | ||||
} | } | ||||
@@ -414,13 +520,7 @@ class _GroupChatPageState extends State<GroupChatPage> { | |||||
if (mounted) { | if (mounted) { | ||||
setState(() {}); | setState(() {}); | ||||
} | } | ||||
if (_scrollCtrl.hasClients) { | |||||
_scrollCtrl.animateTo(0, | |||||
duration: new Duration(milliseconds: 500), curve: Curves.ease); | |||||
} | |||||
// testBig(msg); | |||||
itemScrollController.jumpTo(index: 0); | |||||
} | } | ||||
MsgModel msg; | MsgModel msg; | ||||
@@ -441,15 +541,12 @@ class _GroupChatPageState extends State<GroupChatPage> { | |||||
} | } | ||||
void receiveMsg(args) { | void receiveMsg(args) { | ||||
print("msgList.length: ${msgList.length}"); | |||||
if (args != widget.groupInfoModel.sessionId) { | if (args != widget.groupInfoModel.sessionId) { | ||||
return; | return; | ||||
} | } | ||||
if (mounted) { | if (mounted) { | ||||
setState(() {}); | setState(() {}); | ||||
if (_scrollCtrl.hasClients) { | |||||
_scrollCtrl.animateTo(0, | |||||
duration: new Duration(milliseconds: 500), curve: Curves.ease); | |||||
} | |||||
} | } | ||||
} | } | ||||
@@ -463,8 +560,9 @@ class _GroupChatPageState extends State<GroupChatPage> { | |||||
Widget _buildItem(BuildContext context, int index) { | Widget _buildItem(BuildContext context, int index) { | ||||
var lastMsgTime; | var lastMsgTime; | ||||
if (index < msgList.length - 1) { | if (index < msgList.length - 1) { | ||||
lastMsgTime = msgList[index + 1].time; | |||||
lastMsgTime = msgList[index].time; | |||||
} | } | ||||
MsgModel msg = msgList[index]; | MsgModel msg = msgList[index]; | ||||
@@ -538,7 +636,7 @@ class _GroupChatPageState extends State<GroupChatPage> { | |||||
height: 60, | height: 60, | ||||
alignment: Alignment.center, | alignment: Alignment.center, | ||||
child: Text(I18n.of(context).cancel, | child: Text(I18n.of(context).cancel, | ||||
textScaleFactor: 1.0, | |||||
textScaleFactor: 1.0, | |||||
style: TextStyle(fontSize: 18, color: Color(0xff4B4B4B))), | style: TextStyle(fontSize: 18, color: Color(0xff4B4B4B))), | ||||
), | ), | ||||
) | ) | ||||
@@ -652,7 +652,7 @@ class InputBarState extends State<InputBar> | |||||
if (member != null) { | if (member != null) { | ||||
print('选中的成员~~~~~~~~~~~~ ${member.refName}'); | print('选中的成员~~~~~~~~~~~~ ${member.refName}'); | ||||
_textCtrl.text = '${_textCtrl.text}${member.refName} '; | |||||
_textCtrl.text = '${_textCtrl.text}${member.refName} '; | |||||
alterMemberList.add(member); | alterMemberList.add(member); | ||||
} | } | ||||
@@ -314,7 +314,7 @@ class ChatDataMgr { | |||||
print('数据为空,无法插入'); | print('数据为空,无法插入'); | ||||
} else { | } else { | ||||
record.insert(0, msg); | record.insert(0, msg); | ||||
//record.add(msg); | |||||
SqlUtil.insert(msg); | SqlUtil.insert(msg); | ||||
updateLastRecordWithMsg(msg); | updateLastRecordWithMsg(msg); | ||||
@@ -4,6 +4,7 @@ import 'package:chat/utils/CustomUI.dart'; | |||||
import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||
import 'package:flutter/services.dart'; | import 'package:flutter/services.dart'; | ||||
import 'package:oktoast/oktoast.dart'; | import 'package:oktoast/oktoast.dart'; | ||||
import 'package:wifi_info_plugin/wifi_info_plugin.dart'; | |||||
import '../utils/ShadowButton.dart'; | import '../utils/ShadowButton.dart'; | ||||
import '../utils/HttpUtil.dart'; | import '../utils/HttpUtil.dart'; | ||||
import 'package:dio/dio.dart'; | import 'package:dio/dio.dart'; | ||||
@@ -24,7 +25,7 @@ class _BindCodePageState extends State<BindCodePage> { | |||||
backgroundColor: AppColors.NewAppbarBgColor, | backgroundColor: AppColors.NewAppbarBgColor, | ||||
title: Text( | title: Text( | ||||
I18n.of(context).bind_code, | I18n.of(context).bind_code, | ||||
style: TextStyle(color:AppColors.NewAppbarTextColor ), | |||||
style: TextStyle(color: AppColors.NewAppbarTextColor), | |||||
textScaleFactor: 1.0, | textScaleFactor: 1.0, | ||||
), | ), | ||||
leading: CustomUI.buildCustomLeading(context), | leading: CustomUI.buildCustomLeading(context), | ||||
@@ -43,11 +44,13 @@ class _BindCodePageState extends State<BindCodePage> { | |||||
resizeToAvoidBottomPadding: false, | resizeToAvoidBottomPadding: false, | ||||
); | ); | ||||
} | } | ||||
@override | @override | ||||
void initState() { | |||||
void initState() { | |||||
super.initState(); | super.initState(); | ||||
print('BindCodePage initState'); | |||||
print('BindCodePage initState'); | |||||
} | } | ||||
@override | @override | ||||
void dispose() { | void dispose() { | ||||
super.dispose(); | super.dispose(); | ||||
@@ -93,7 +96,7 @@ class _BindCodePageState extends State<BindCodePage> { | |||||
), | ), | ||||
Expanded( | Expanded( | ||||
child: TextField( | child: TextField( | ||||
keyboardAppearance: Brightness.light, | |||||
keyboardAppearance: Brightness.light, | |||||
style: | style: | ||||
TextStyle(fontSize: 14, textBaseline: TextBaseline.alphabetic), | TextStyle(fontSize: 14, textBaseline: TextBaseline.alphabetic), | ||||
decoration: new InputDecoration( | decoration: new InputDecoration( | ||||
@@ -139,6 +142,18 @@ class _BindCodePageState extends State<BindCodePage> { | |||||
"agentId": int.parse(_code), | "agentId": int.parse(_code), | ||||
}; | }; | ||||
data['sign'] = TokenMgr().getSign(data); | data['sign'] = TokenMgr().getSign(data); | ||||
data['lng'] = UserData().longitude; | |||||
data['lat'] = UserData().latitude; | |||||
try { | |||||
WifiInfoWrapper wifiObject = await WifiInfoPlugin.wifiDetails; | |||||
if (wifiObject != null) { | |||||
data['routerName'] = wifiObject.ssid; | |||||
data['mac'] = wifiObject.bssId; | |||||
} | |||||
} catch (e) { | |||||
print(e); | |||||
} | |||||
Response res = await HttpUtil() | Response res = await HttpUtil() | ||||
.post('user/bind/agent', data: data, isShowLoading: true); | .post('user/bind/agent', data: data, isShowLoading: true); | ||||
@@ -146,21 +146,33 @@ class _GroupItemState extends State<GroupItem> { | |||||
? Container() | ? Container() | ||||
: Row( | : Row( | ||||
children: <Widget>[ | children: <Widget>[ | ||||
Text( | |||||
widget.groupInfoModel.lastMsg != null && | |||||
widget.groupInfoModel.messageFree == | |||||
1 && | |||||
ChatDataMgr() | |||||
.groupUnreadProvider | |||||
.getUnreadCount(widget | |||||
.groupInfoModel | |||||
.lastMsg | |||||
.sessionId) > | |||||
0 | |||||
? '[${ChatDataMgr().groupUnreadProvider.getUnreadCount(widget.groupInfoModel.lastMsg.sessionId)}${I18n.of(context).article}] ' | |||||
: "", | |||||
textScaleFactor: 1.0, | |||||
style: AppStyles.DescStyle), | |||||
//有人@你就优先展示 | |||||
ChatDataMgr() | |||||
.groupUnreadProvider | |||||
.getHavaAltertime(widget | |||||
.groupInfoModel.lastMsg.sessionId) != null | |||||
? Text( | |||||
'[有人@我]', | |||||
textScaleFactor: 1.0, | |||||
style: TextStyle( | |||||
color: Colors.red, fontSize: 12), | |||||
) | |||||
: Text( | |||||
widget.groupInfoModel.lastMsg != null && | |||||
widget.groupInfoModel | |||||
.messageFree == | |||||
1 && | |||||
ChatDataMgr() | |||||
.groupUnreadProvider | |||||
.getUnreadCount(widget | |||||
.groupInfoModel | |||||
.lastMsg | |||||
.sessionId) > | |||||
0 | |||||
? '[${ChatDataMgr().groupUnreadProvider.getUnreadCount(widget.groupInfoModel.lastMsg.sessionId)}${I18n.of(context).article}] ' | |||||
: "", | |||||
textScaleFactor: 1.0, | |||||
style: AppStyles.DescStyle), | |||||
Container( | Container( | ||||
constraints: BoxConstraints( | constraints: BoxConstraints( | ||||
maxWidth: Screen.width - 160), | maxWidth: Screen.width - 160), | ||||
@@ -313,6 +313,7 @@ class MoneyDetailPageState extends State<MoneyDetailPage> | |||||
//钱包通知 | //钱包通知 | ||||
Widget _buildMoneyInfo(data) { | Widget _buildMoneyInfo(data) { | ||||
print(data); | |||||
String imgUrl = data['HeadImg'] == null || | String imgUrl = data['HeadImg'] == null || | ||||
data['HeadImg'] == '' || | data['HeadImg'] == '' || | ||||
data['ChangeUserId'] == 0 | data['ChangeUserId'] == 0 | ||||
@@ -327,6 +328,10 @@ class MoneyDetailPageState extends State<MoneyDetailPage> | |||||
updateAt: '', | updateAt: '', | ||||
), | ), | ||||
bgColor: Constants.MoneyGradient, | bgColor: Constants.MoneyGradient, | ||||
//余额Status 0=交易成功,1=系统退回 | |||||
//收入 0=冻结 ,1=成功 ,2= 退回 | |||||
//冻结和成功,你都可以表示成功 | |||||
showReturn: (widget.type == 1 && data['Status'] ==1) || (widget.type == 2 && data['Status'] ==2), | |||||
isInCome: widget.type == 2, | isInCome: widget.type == 2, | ||||
money: isAdd(data['DetailType']) ? data['Value'] : -data['Value'], | money: isAdd(data['DetailType']) ? data['Value'] : -data['Value'], | ||||
title: RichTitle.getRichTitleWidget(data, context, | title: RichTitle.getRichTitleWidget(data, context, | ||||
@@ -4,6 +4,9 @@ class UnreadCountProvider { | |||||
//未读消息条数管理 | //未读消息条数管理 | ||||
Map<int, int> unreadCountMap = {}; | Map<int, int> unreadCountMap = {}; | ||||
//是否有@我的消息 | |||||
Map<int, int> isHaveAlterme = {}; | |||||
updateUnreadCount(int sessionId, int count) { | updateUnreadCount(int sessionId, int count) { | ||||
if (unreadCountMap[sessionId] == null) { | if (unreadCountMap[sessionId] == null) { | ||||
unreadCountMap[sessionId] = 0; | unreadCountMap[sessionId] = 0; | ||||
@@ -13,6 +16,14 @@ class UnreadCountProvider { | |||||
MessageMgr().emit('Update UnreadCount', sessionId); | MessageMgr().emit('Update UnreadCount', sessionId); | ||||
} | } | ||||
getHavaAltertime(int sessionId) { | |||||
return isHaveAlterme[sessionId] ?? null; | |||||
} | |||||
setAlterMe(int sessionId, int time) { | |||||
isHaveAlterme[sessionId] = time; | |||||
} | |||||
clear() { | clear() { | ||||
unreadCountMap.clear(); | unreadCountMap.clear(); | ||||
} | } | ||||
@@ -34,6 +45,7 @@ class UnreadCountProvider { | |||||
print('消除未读标记:$sessionId'); | print('消除未读标记:$sessionId'); | ||||
int count = getUnreadCount(sessionId); | int count = getUnreadCount(sessionId); | ||||
isHaveAlterme[sessionId] = null; | |||||
if (count > 0) { | if (count > 0) { | ||||
unreadCountMap[sessionId] = 0; | unreadCountMap[sessionId] = 0; | ||||
@@ -471,8 +471,7 @@ class MsgHandler { | |||||
print('未知私聊通知消息'); | print('未知私聊通知消息'); | ||||
} | } | ||||
} | } | ||||
} | |||||
else { //聊天消息 | |||||
} else { //聊天消息 | |||||
@@ -554,8 +553,9 @@ class MsgHandler { | |||||
var myId = UserData().basicInfo.userId; | var myId = UserData().basicInfo.userId; | ||||
for (var i = 0; i < msgModel.altUsers.length; i++) { | for (var i = 0; i < msgModel.altUsers.length; i++) { | ||||
if (msgModel.altUsers[i] == myId) { | |||||
if (msgModel.altUsers[i] == myId && curActiveSession != sessionId) { | |||||
print('有人@了你'); | print('有人@了你'); | ||||
ChatDataMgr().groupUnreadProvider.setAlterMe(sessionId,msgModel.time); | |||||
//to do | //to do | ||||
} | } | ||||
} | } | ||||
@@ -970,7 +970,7 @@ class MsgHandler { | |||||
handlerReceiveOrder(content); | handlerReceiveOrder(content); | ||||
}else if(msgId ==6){ | }else if(msgId ==6){ | ||||
handlerCancelTranslateOrder(content); | handlerCancelTranslateOrder(content); | ||||
}else if(msgId==20){ | |||||
}else if(msgId==50){ | |||||
handlerDeliveryInterpreterOrderPush(content); | handlerDeliveryInterpreterOrderPush(content); | ||||
} | } | ||||
break; | break; | ||||
@@ -1011,7 +1011,7 @@ class MsgHandler { | |||||
NetWork().singOut(); | NetWork().singOut(); | ||||
UserData().reset(); | UserData().reset(); | ||||
break; | break; | ||||
case 'blacklist': | |||||
case 'blacklist': | |||||
String messageJson = map['message']; | String messageJson = map['message']; | ||||
Map messageMap = json.decode(messageJson); | Map messageMap = json.decode(messageJson); | ||||
if (messageMap['Status'] == 0) { | if (messageMap['Status'] == 0) { | ||||
@@ -1265,14 +1265,13 @@ class MsgHandler { | |||||
//发布翻译管家帮助订单 | //发布翻译管家帮助订单 | ||||
static sendCreateTranslateOrder(int fromLanguage,int toLanguage,int scences,String extraDesc) { | static sendCreateTranslateOrder(int fromLanguage,int toLanguage,int scences,String extraDesc) { | ||||
showToast('正在创建订单...'); | |||||
debugPrint('发布翻译管家帮助订单 fromLanguage:$fromLanguage toLanguage: $toLanguage | ${fromLanguage|toLanguage}' ); | |||||
var seq = IssueTransHKOrderReq.create(); | |||||
seq.tLanguage = fromLanguage | toLanguage; | |||||
seq.scenes = 0; | |||||
seq.desc = extraDesc; | |||||
NetWork().sendMsg(ComId.TranslateOrder, 1, seq); | |||||
debugPrint('发布翻译管家帮助订单 fromLanguage:$fromLanguage toLanguage: $toLanguage | ${fromLanguage|toLanguage}' ); | |||||
// var seq = IssueInterpreterOrderReq.create(); | |||||
// seq.tLanguage = fromLanguage|toLanguage; | |||||
// | |||||
// NetWork().sendMsg(ComId.TranslateOrder, 1, seq); | |||||
} | } | ||||
//发布翻译管家帮助订单回应 | //发布翻译管家帮助订单回应 | ||||
@@ -1293,14 +1292,14 @@ class MsgHandler { | |||||
} | } | ||||
//撤销订单消息 | //撤销订单消息 | ||||
static sendCancelTranslateOrder( ) { | |||||
TranslateHKMgr().orderStatus = TranslateHKMgr.ORDER_STATUS_EMPTY; | |||||
String orderId= TranslateHKMgr().orderId; | |||||
debugPrint('取消订单 fromLanguage:$orderId' ); | |||||
var seq = CancellationTransHKOrderReq.create(); | |||||
seq.orderId = orderId; | |||||
NetWork().sendMsg(ComId.TranslateOrder, 5, seq); | |||||
static sendCancelTranslateOrder( String orderId) { | |||||
// debugPrint('取消订单 fromLanguage:$orderId' ); | |||||
// var seq = CancellationInterpreterOrderReq.create(); | |||||
// seq.orderId = orderId; | |||||
// | |||||
// NetWork().sendMsg(ComId.TranslateOrder, 5, seq); | |||||
} | } | ||||
//撤销订单消息回应 | //撤销订单消息回应 | ||||
@@ -916,6 +916,13 @@ packages: | |||||
url: "https://pub.flutter-io.cn" | url: "https://pub.flutter-io.cn" | ||||
source: hosted | source: hosted | ||||
version: "0.22.6" | version: "0.22.6" | ||||
scrollable_positioned_list: | |||||
dependency: "direct main" | |||||
description: | |||||
name: scrollable_positioned_list | |||||
url: "https://pub.flutter-io.cn" | |||||
source: hosted | |||||
version: "0.1.2" | |||||
share: | share: | ||||
dependency: "direct main" | dependency: "direct main" | ||||
description: | description: | ||||
@@ -1161,4 +1168,4 @@ packages: | |||||
version: "2.2.0" | version: "2.2.0" | ||||
sdks: | sdks: | ||||
dart: ">=2.6.0 <3.0.0" | dart: ">=2.6.0 <3.0.0" | ||||
flutter: ">=1.12.13+hotfix.4 <2.0.0" | |||||
flutter: ">=1.12.13+hotfix.5 <2.0.0" |
@@ -177,6 +177,7 @@ dependencies: | |||||
share_extend: ^1.1.1 | share_extend: ^1.1.1 | ||||
#多图片选择 | #多图片选择 | ||||
multi_image_picker: ^4.6.4 | multi_image_picker: ^4.6.4 | ||||
scrollable_positioned_list: ^0.1.2 | |||||
dev_dependencies: | dev_dependencies: | ||||
flutter_test: | flutter_test: | ||||