newsfeed_card_content.dart 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. import 'dart:math';
  2. import 'package:auto_route/src/route/page_route_info.dart';
  3. import 'package:cpt_community/components/comments_dialog.dart';
  4. import 'package:cpt_community/modules/community/community_page.dart';
  5. import 'package:cs_resources/theme/app_colors_theme.dart';
  6. import 'package:flutter/material.dart';
  7. import 'package:flutter/widgets.dart';
  8. import 'package:plugin_basic/modules/global_web_page.dart';
  9. import 'package:plugin_basic/modules/preview_photo_page.dart';
  10. import 'package:plugin_basic/router/basic_page_router.dart';
  11. import 'package:router/componentRouter/component_service_manager.dart';
  12. import 'package:router/ext/auto_router_extensions.dart';
  13. import 'package:shared/utils/color_utils.dart';
  14. import 'package:shared/utils/log_utils.dart';
  15. import 'package:widgets/ext/ex_widget.dart';
  16. import 'package:widgets/my_load_image.dart';
  17. import 'package:widgets/my_text_view.dart';
  18. // 'id':1,
  19. // 'avator': Assets.communityCamera,
  20. // 'title': 'William Jefferson',
  21. // 'isFollow': false,
  22. // 'content': 'She said YES and our lives changed.Thank you all for coming to my propose today.We hope everyone can ……[More]',
  23. // 'imageUrls': ['https://img2.baidu.com/it/u=3489233687,2364672159&fm=253&fmt=auto&app=120&f=JPEG?w=507&h=500','https://img2.baidu.com/it/u=3489233687,2364672159&fm=253&fmt=auto&app=120&f=JPEG?w=507&h=500','https://img2.baidu.com/it/u=3489233687,2364672159&fm=253&fmt=auto&app=120&f=JPEG?w=507&h=500'],
  24. // 'time': 'June 17,2016 at 7:23 p.m.',
  25. // 'likeno': 12
  26. class NewsFeedCardContent extends StatelessWidget {
  27. final String content;
  28. final List<dynamic>? imageUrls;
  29. int? rowMaxImageNum=3;
  30. int? textMaxLines = 3;
  31. bool? isPreviewImage = true;
  32. NewsFeedCardContent({
  33. Key? key,
  34. required this.content,
  35. required List<dynamic> this.imageUrls,
  36. this.rowMaxImageNum = 3,
  37. this.textMaxLines = 3,
  38. this.isPreviewImage = true,
  39. }) : super(key: key);
  40. @override
  41. Widget build(BuildContext context) {
  42. List imageUrlsList = [];
  43. if(imageUrls != null && imageUrls!.isNotEmpty){
  44. // dart 取出 imageUrls 里面的前 rowMaxImageNum 张图片
  45. imageUrlsList = imageUrls!.take(rowMaxImageNum!).toList();
  46. }
  47. int totalImageCount = imageUrls!.length;
  48. int otherImageCount = imageUrls!.length - rowMaxImageNum!;
  49. int rowActualImageCount = imageUrls!.length > rowMaxImageNum! ? rowMaxImageNum! : imageUrls!.length;
  50. return LayoutBuilder(
  51. builder: (BuildContext context, BoxConstraints constraints) {
  52. final maxHeight = constraints.maxHeight;
  53. final minHeight = constraints.minHeight;
  54. final maxWidth = constraints.maxWidth;
  55. // Log.d("---maxHeight-----$maxHeight-- $minHeight $maxWidth--");
  56. return Container(
  57. width: double.infinity,
  58. // color: Colors.red,
  59. padding: const EdgeInsets.symmetric(horizontal: 15),
  60. child: Column(
  61. crossAxisAlignment: CrossAxisAlignment.start,
  62. children: [
  63. MyTextView(
  64. content,
  65. textColor: context.appColors.textBlack,
  66. fontSize: 15,
  67. maxLines: textMaxLines,
  68. isTextEllipsis: true,
  69. ),
  70. const SizedBox(height: 12),
  71. // 图片
  72. _buildImageSection(
  73. context,
  74. isPreviewImage!,
  75. maxWidth - 15,
  76. imageUrlsList,
  77. imageUrls,
  78. totalImageCount,
  79. otherImageCount,
  80. rowMaxImageNum!
  81. ),
  82. ]
  83. )
  84. );
  85. }
  86. );
  87. }
  88. Widget _buildImageSection(BuildContext context,bool isPreviewImage, double maxWidth, List? imageUrls,List? totalImageUrls, int totalImageCount, int otherImageCount, int rowMaxImageNum) {
  89. if (imageUrls != null && imageUrls!.isNotEmpty) {
  90. final imageCount = imageUrls.length;
  91. return SizedBox(
  92. width: maxWidth,
  93. height: 87,
  94. child: Row(
  95. mainAxisAlignment: MainAxisAlignment.start,
  96. children: List.generate(
  97. imageUrls.length,
  98. (index) => Container(
  99. height: 87,
  100. width: (totalImageCount < rowMaxImageNum)? maxWidth/rowMaxImageNum - 16 : maxWidth/imageCount - 16,
  101. margin: EdgeInsets.only(right: (index!=imageCount-1) ? 16 : 0 ),
  102. color: ColorUtils.string2Color("#F2F3F6"),
  103. child:Stack(
  104. children: [
  105. MyLoadImage(
  106. imageUrls[index],
  107. height: 87,
  108. // width: maxWidth/imageCount - 16,
  109. width: (totalImageCount < rowMaxImageNum)? maxWidth/rowMaxImageNum - 16 : maxWidth/imageCount - 16,
  110. fit: BoxFit.cover,
  111. // fit:BoxFit.fitWidth,
  112. cornerRadius: 5,
  113. onClick: (){
  114. if(isPreviewImage){
  115. // 点击图片预览
  116. // 过滤掉非字符串类型的元素
  117. List<String> filteredImages = totalImageUrls?.whereType<String>().toList() ?? [];
  118. // PreviewPhotoPage.startInstance(context: context, images: filteredImages, position: index);
  119. context.appRouter.push(PreviewPhotoPageRoute(images: filteredImages, position: index));
  120. }
  121. },
  122. ),
  123. otherImageCount > 0 && index == imageCount-1 ?
  124. Positioned(
  125. bottom: 0,
  126. right: 0,
  127. child: Container(
  128. padding: const EdgeInsets.symmetric(horizontal: 5, vertical: 2),
  129. color: context.appColors.textBlack.withOpacity(0.5),
  130. child: MyTextView(
  131. "+$otherImageCount",
  132. textColor: Colors.white,
  133. fontSize: 12,
  134. ),
  135. ),
  136. ): const SizedBox.shrink(),
  137. ]
  138. )
  139. ),
  140. )
  141. )
  142. );
  143. } else {
  144. return const SizedBox.shrink();
  145. }
  146. }
  147. }