Hibok
25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

120 lines
3.4 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: Text(name,
  91. textScaleFactor: 1.0,
  92. overflow: TextOverflow.ellipsis,
  93. style: TextStyle(fontSize: 13.0)),
  94. padding: EdgeInsets.only(bottom: 2),
  95. constraints: BoxConstraints(
  96. maxWidth: Screen.width - 120 - 122, maxHeight: 50),
  97. ),
  98. Expanded(child: SizedBox()),
  99. fixedText(sizeStr, fontSize: 12, color: Colors.grey)
  100. ],
  101. )),
  102. msgModel.localFile == null
  103. ? Container(
  104. constraints: BoxConstraints(
  105. maxWidth: 40,
  106. ),
  107. child: fixedText('未下载', fontSize: 12, color: Colors.grey))
  108. : Container()
  109. ],
  110. ),
  111. ),
  112. );
  113. }
  114. }