Hibok
Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.
 
 
 
 
 
 

117 Zeilen
3.3 KiB

  1. import 'package:chat/models/ChatMsg.dart';
  2. import 'package:chat/proto/chat.pb.dart';
  3. import 'package:chat/r.dart';
  4. import 'package:chat/utils/screen.dart';
  5. import 'package:flutter/material.dart';
  6. import 'package:open_file/open_file.dart';
  7. class FileMsgItem extends StatelessWidget {
  8. final MsgModel msgModel;
  9. FileMsgItem(this.msgModel);
  10. getTypeImage(String type) {
  11. type = type.toLowerCase();
  12. switch (type) {
  13. case 'pdf':
  14. return R.assetsImagesExtPdf;
  15. break;
  16. case 'doc':
  17. case 'docx':
  18. return R.assetsImagesExtWord;
  19. break;
  20. case 'ppt':
  21. return R.assetsImagesExtPpt;
  22. break;
  23. case 'xls':
  24. case 'xlsx':
  25. return R.assetsImagesExtExcel;
  26. break;
  27. case 'txt':
  28. case 'xml':
  29. case 'html':
  30. case 'htm':
  31. case '.h':
  32. case '.cpp':
  33. case '.conf':
  34. case '.c':
  35. return R.assetsImagesExtTxt;
  36. break;
  37. case 'tar':
  38. case 'gz':
  39. case 'gzip':
  40. case 'tgz':
  41. case 'zip':
  42. return R.assetsImagesExtZip;
  43. break;
  44. case 'mp3':
  45. case 'wav':
  46. return R.assetsImagesExtSound;
  47. break;
  48. case 'mp4':
  49. case 'avi':
  50. case 'mpg':
  51. case 'wm':
  52. case 'wmv':
  53. return R.assetsImagesExtVideo;
  54. break;
  55. case 'apk':
  56. return R.assetsImagesExtApk;
  57. break;
  58. default:
  59. return R.assetsImagesExtUnknown;
  60. }
  61. }
  62. @override
  63. Widget build(BuildContext context) {
  64. var fileMsg = FileChat.fromBuffer(msgModel.msgContent);
  65. var type = fileMsg.type;
  66. var size = fileMsg.size;
  67. var name = fileMsg.name;
  68. var sizeStr = '${(size / 1024).toStringAsFixed(1)}K';
  69. if (size > 1024 * 1024) {
  70. sizeStr = '${(size / 1024 / 1024).toStringAsFixed(1)}M';
  71. }
  72. return InkWell(
  73. onTap: msgModel.localFile != null
  74. ? () {
  75. print('打开文件 ${msgModel.localFile}');
  76. OpenFile.open(msgModel.localFile);
  77. }
  78. : null,
  79. child: Container(
  80. child: Row(
  81. mainAxisSize: MainAxisSize.min,
  82. children: <Widget>[
  83. Image.asset(getTypeImage(type), width: 45),
  84. Padding(
  85. padding: EdgeInsets.symmetric(vertical: 5, horizontal: 8),
  86. child: Column(
  87. crossAxisAlignment: CrossAxisAlignment.start,
  88. children: <Widget>[
  89. Container(
  90. child: fixedText(name, fontSize: 13),
  91. padding: EdgeInsets.only(bottom: 2),
  92. constraints: BoxConstraints(
  93. maxWidth: Screen.width - 120 - 122, maxHeight: 50),
  94. ),
  95. Expanded(child: SizedBox()),
  96. fixedText(sizeStr, fontSize: 12, color: Colors.grey)
  97. ],
  98. )),
  99. msgModel.localFile == null
  100. ? Container(
  101. constraints: BoxConstraints(
  102. maxWidth: 40,
  103. ),
  104. child: fixedText('未下载', fontSize: 12, color: Colors.grey))
  105. : Container()
  106. ],
  107. ),
  108. ),
  109. );
  110. }
  111. }