chat_content_view.dart 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. import 'package:flutter/material.dart';
  2. import 'package:flutter_screenutil/flutter_screenutil.dart';
  3. import '../../common/style/style.dart' show AppColors,Constants,ICons,MessageDetailSelects;
  4. import '../component/user_avatat.dart';
  5. class ChatContentView extends StatelessWidget {
  6. int type; //0 代表对方 , 1代表自己
  7. String text;//聊天内容
  8. String avatar;//头像url
  9. String username;//昵称
  10. int userType;//聊天类型 2群组 1单聊
  11. bool isNetwork;
  12. ChatContentView({Key key, this.type, this.text,this.avatar,this.isNetwork,this.username,this.userType})
  13. : super(key: key);
  14. @override
  15. Widget build(BuildContext context) {
  16. var tapPos;
  17. //头像组件
  18. Widget userAvatar = UserAvatar(
  19. padding: EdgeInsets.only(
  20. top: ScreenUtil().setHeight(5),
  21. right: (type == 0 ? 0.0 : ScreenUtil().setWidth(15)),
  22. left: (type == 0 ? ScreenUtil().setWidth(15) : 0.0)
  23. ),
  24. width: ScreenUtil().setWidth(40),
  25. height: ScreenUtil().setWidth(40),
  26. image: avatar!='' ? avatar: 'assets/images/temporary/avator2.png',
  27. isNetwork: isNetwork,
  28. onPressed: () {print('点击头像');}
  29. );
  30. Widget userNameWidget = Container(
  31. margin: EdgeInsets.only(left: type == 0 ? ScreenUtil().setWidth(20) : 0,bottom: ScreenUtil().setHeight(10),right: type == 0 ? 0: ScreenUtil().setWidth(20)),
  32. child: Text(username,style: TextStyle(color: Color(AppColors.ChatTime),fontSize: ScreenUtil().setSp(23.0)),),
  33. );
  34. _showMenu(BuildContext context,Offset tapPos){
  35. final RenderBox overlay =Overlay.of(context).context.findRenderObject();
  36. final RelativeRect position = RelativeRect.fromLTRB(
  37. tapPos.dx, tapPos.dy,
  38. overlay.size.width - tapPos.dx,
  39. overlay.size.height - tapPos.dy
  40. );
  41. showMenu<String>(
  42. context: context,
  43. position: position,
  44. items: <PopupMenuItem<String>>[
  45. PopupMenuItem(
  46. child: Text(MessageDetailSelects.MENU_COPY_VALUE),
  47. value: MessageDetailSelects.MENU_COPY,
  48. ),
  49. PopupMenuItem(
  50. child: Text(MessageDetailSelects.MENU_SHARE_FRIENDS_VALUE),
  51. value: MessageDetailSelects.MENU_SHARE_FRIENDS,
  52. ),
  53. PopupMenuItem(
  54. child: Text(MessageDetailSelects.MENU_FAVORIITE_VALUE),
  55. value: MessageDetailSelects.MENU_FAVORIITE,
  56. ),
  57. PopupMenuItem(
  58. child: Text(MessageDetailSelects.MENU_REMIND_VALUE),
  59. value: MessageDetailSelects.MENU_REMIND,
  60. ),
  61. PopupMenuItem(
  62. child: Text(MessageDetailSelects.MENU_TRANSLATE_VALUE),
  63. value: MessageDetailSelects.MENU_TRANSLATE,
  64. ),
  65. PopupMenuItem(
  66. child: Text(MessageDetailSelects.MENU_DELATE_VALUE),
  67. value: MessageDetailSelects.MENU_DELATE,
  68. ),
  69. PopupMenuItem(
  70. child: Text(MessageDetailSelects.MENU_MULTIPE_CHOICE_VALUE),
  71. value: MessageDetailSelects.MENU_MULTIPE_CHOICE,
  72. ),
  73. ]
  74. ).then<String>((String selected) {
  75. switch(selected){
  76. default:
  77. print('当前选中的是:$selected');
  78. }
  79. });
  80. }
  81. Widget messageTextWidget = InkWell(
  82. onTapDown: (TapDownDetails details) {
  83. tapPos = details.globalPosition;
  84. },
  85. onLongPress: (){
  86. _showMenu(context,tapPos);
  87. print('弹出会话菜单');
  88. },
  89. child: Container(
  90. margin: type == 0 ? EdgeInsets.only(left:ScreenUtil().setWidth(10),right: ScreenUtil().setWidth(57)) :EdgeInsets.only(left:ScreenUtil().setWidth(57),right: ScreenUtil().setWidth(10)),
  91. child: Text(text,
  92. // style: TextStyle(fontSize: ScreenUtil().setSp(15.0),color: Color(0xff999999),height: 1.3),
  93. style: TextStyle(fontSize: ScreenUtil().setSp(15.0),color: Color(AppColors.TextBobule),height: 1.3),
  94. ),
  95. padding: EdgeInsets.only(left:ScreenUtil().setWidth(8),right:ScreenUtil().setWidth(8),bottom:ScreenUtil().setHeight(8),top:ScreenUtil().setHeight(8)),
  96. decoration: BoxDecoration(
  97. borderRadius: BorderRadius.circular(5.0),
  98. color: type == 0 ? Color(AppColors.TextBobuleLeft) : Color(AppColors.TextBobuleLeft),
  99. ),
  100. ),
  101. );
  102. final List<Widget> nameAndText = [
  103. userNameWidget,
  104. messageTextWidget
  105. ];
  106. final List<Widget> onlyText = [
  107. messageTextWidget
  108. ];
  109. textBubble(){
  110. return Expanded(
  111. child: Column(
  112. crossAxisAlignment: type == 0 ? CrossAxisAlignment.start : CrossAxisAlignment.end,
  113. children: userType == 2 && type == 0 ? nameAndText : onlyText,
  114. )
  115. );
  116. }
  117. return Container(
  118. margin: EdgeInsets.only(bottom: ScreenUtil().setHeight(10.0),top: ScreenUtil().setHeight(10.0)),
  119. child: type == 0 ?
  120. Row(
  121. crossAxisAlignment: CrossAxisAlignment.start,
  122. children: <Widget>[
  123. userAvatar,
  124. textBubble()
  125. ],
  126. ) :
  127. Row(
  128. crossAxisAlignment: CrossAxisAlignment.start,
  129. children: <Widget>[
  130. textBubble(),
  131. userAvatar,
  132. ],
  133. ) ,
  134. );
  135. }
  136. }