track_daily_report_dialog.dart 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. import 'package:flutter/cupertino.dart';
  2. import 'package:flutter/material.dart';
  3. import 'package:flutter_screenutil/flutter_screenutil.dart';
  4. import 'package:get/get.dart';
  5. import 'package:get/get_core/src/get_main.dart';
  6. import 'package:location/module/track/track_dialog/track_overlapping_avatars.dart';
  7. import 'package:location/resource/colors.gen.dart';
  8. import 'package:location/utils/common_expand.dart';
  9. import '../../../data/bean/track_daily_dialogs_info.dart';
  10. import '../../../resource/assets.gen.dart';
  11. class TrackDailyReportDialog {
  12. static void show({
  13. VoidCallback? cancelOnTap,
  14. VoidCallback? confirmOnTap,
  15. List<TrackDailyDialogsInfo>? trackDailyList,
  16. }) {
  17. Get.dialog(
  18. barrierDismissible: false,
  19. SimpleDialog(
  20. titlePadding: EdgeInsets.zero,
  21. contentPadding: EdgeInsets.zero,
  22. insetPadding: EdgeInsets.zero,
  23. backgroundColor:Colors.transparent,
  24. children: [
  25. TrackDailyReportTipView(
  26. cancelOnTap: () {
  27. Get.back();
  28. cancelOnTap!();
  29. },
  30. confirmOnTap: confirmOnTap,
  31. trackDailyList: trackDailyList,
  32. )
  33. ],
  34. )
  35. );
  36. }
  37. }
  38. class TrackDailyReportTipView extends StatefulWidget {
  39. final VoidCallback? cancelOnTap;
  40. final VoidCallback? confirmOnTap;
  41. final List<TrackDailyDialogsInfo>? trackDailyList;
  42. const TrackDailyReportTipView({
  43. super.key,
  44. this.cancelOnTap,
  45. required this.confirmOnTap,
  46. this.trackDailyList,
  47. });
  48. @override
  49. State<TrackDailyReportTipView> createState() => _TrackDailyReportTipViewState();
  50. }
  51. class _TrackDailyReportTipViewState extends State<TrackDailyReportTipView> {
  52. late List<String> avatarUrls = [];
  53. @override
  54. void initState() {
  55. super.initState();
  56. print("widget.trackDailyListfsdfsdf---${widget.trackDailyList}");
  57. avatarUrls = extractUrls(widget.trackDailyList);//widget.trackDailyList!.map((item) => item.avatar ?? "").whereType<String>().toList();
  58. }
  59. List<String> extractUrls(List<TrackDailyDialogsInfo>? trackDailyList) {
  60. // 若列表为 null,则返回空列表
  61. if (trackDailyList == null) return [];
  62. // 使用 map 操作提取 url 字段,并过滤掉可能的 null 值
  63. return trackDailyList
  64. .map((item) => item.avatar) // 假设 TrackDailyDialogsInfo 类中有 url 字段
  65. .whereType<String>() // 过滤掉可能的 null 值
  66. .toList();
  67. }
  68. //计算出头像总共的宽度
  69. double _calculateTheTotalWithAvatar(List<String> avatarUrls) {
  70. var resultTotalW = 38.w;
  71. if (avatarUrls.length > 5) {
  72. resultTotalW = (avatarUrls.length - 1) * 29.w + 9.w;
  73. } else if (avatarUrls.length > 1) {
  74. resultTotalW = (avatarUrls.length) * 29.w + 9.w;
  75. }
  76. return resultTotalW;
  77. }
  78. @override
  79. Widget build(BuildContext context) {
  80. // TODO: implement build
  81. return Container(
  82. width: 1.sw,
  83. margin: EdgeInsets.symmetric(horizontal: 43.w),
  84. child: IntrinsicHeight(
  85. child: Column(
  86. children: [
  87. Container(
  88. decoration: BoxDecoration(
  89. color: Colors.transparent,
  90. image: DecorationImage(
  91. image: Assets.images.iconTrackDailyReport.provider(),
  92. fit: BoxFit.fill,
  93. )
  94. ),
  95. child: Column(
  96. children: [
  97. SizedBox(
  98. height: 146.w,
  99. ),
  100. Container(
  101. height: 38.w,
  102. width: _calculateTheTotalWithAvatar(avatarUrls),
  103. child: OverlappingAvatars(
  104. avatarUrls: avatarUrls,
  105. size: 38.w,
  106. overlap: 0.763,
  107. borderColor: "#A287FF".color,
  108. maxDisplay: 5,
  109. ),
  110. ),
  111. SizedBox(
  112. height: 8.w,
  113. ),
  114. Text("昨日轨迹报告",
  115. style: TextStyle(
  116. fontSize: 13.sp,
  117. color: '#57577E'.color,
  118. fontWeight: FontWeight.w700)
  119. ),
  120. SizedBox(
  121. height: 46.w,
  122. ),
  123. GestureDetector(
  124. onTap: () {
  125. Get.back();
  126. widget.confirmOnTap!();
  127. },
  128. child: Container(
  129. decoration: BoxDecoration(
  130. gradient: LinearGradient(
  131. begin: Alignment.centerLeft, // 90度相当于从左到右
  132. end: Alignment.centerRight,
  133. colors: [
  134. Color(0xFF7B7DFF), // #7B7DFF
  135. Color(0xFF6365FF), // #6365FF
  136. ],
  137. stops: [0.0, 1.0],
  138. // 从0%到100%
  139. ),
  140. borderRadius: BorderRadius.circular(40.w / 2.0),
  141. ),
  142. margin: EdgeInsets.symmetric(horizontal: 20.w),
  143. height: 40.w,
  144. alignment: Alignment.center,
  145. child: Text("立即查看",
  146. style: TextStyle(
  147. fontSize: 14.sp,
  148. color: '#FFFFFF'.color,
  149. fontWeight: FontWeight.w500)
  150. ),
  151. ),
  152. ),
  153. SizedBox(
  154. height: 10.w,
  155. ),
  156. GestureDetector(
  157. onTap: widget.cancelOnTap,
  158. child: Container(
  159. height: 20.w,
  160. child: Text("下次再说",
  161. style: TextStyle(
  162. fontSize: 11.sp,
  163. color: '#898996'.color,
  164. fontWeight: FontWeight.w500)
  165. ),
  166. ),
  167. ),
  168. SizedBox(
  169. height: 12.w,
  170. ),
  171. ],
  172. ),
  173. )
  174. ],
  175. ),
  176. ),
  177. );
  178. }
  179. }