track_share_view.dart 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. import 'package:flutter/cupertino.dart';
  2. import 'package:flutter/material.dart';
  3. import 'package:flutter_screenutil/flutter_screenutil.dart';
  4. import 'package:location/data/api/response/track_daily_summary_response.dart';
  5. import 'package:location/data/bean/user_info.dart';
  6. import 'package:location/resource/assets.gen.dart';
  7. import 'package:location/resource/string.gen.dart';
  8. import 'package:location/utils/common_expand.dart';
  9. import 'package:location/utils/date_util.dart';
  10. import '../../../data/bean/track_summary.dart';
  11. import '../../../resource/colors.gen.dart';
  12. import '../../../resource/fonts.gen.dart';
  13. import '../../../utils/common_style.dart';
  14. import '../../../widget/dashed_line.dart';
  15. import '../../../widget/rich_text_replace.dart';
  16. class TrackShareView extends StatelessWidget {
  17. final TrackDailySummaryResponse trackDailySummary;
  18. final UserInfo userInfo;
  19. final int day;
  20. const TrackShareView(this.day, this.userInfo, this.trackDailySummary,
  21. {super.key});
  22. @override
  23. Widget build(BuildContext context) {
  24. return Container(
  25. width: double.infinity,
  26. decoration: BoxDecoration(
  27. gradient: LinearGradient(
  28. colors: ['#C8C0FF'.color, '#FFFFFF'.color, '#B7ACFF'.color],
  29. begin: Alignment.bottomLeft,
  30. end: Alignment.topRight),
  31. ),
  32. child: Stack(
  33. children: [
  34. buildShareTitleView(),
  35. buildRobotView(),
  36. buildShareContentView(),
  37. _buildShareAvatarView(),
  38. ],
  39. ),
  40. );
  41. }
  42. Widget buildShareContentView() {
  43. return Positioned(
  44. left: 24.w,
  45. right: 24.w,
  46. top: 129.w,
  47. child: Column(
  48. children: [
  49. buildContent1View(),
  50. Container(
  51. color: ColorName.white,
  52. margin: EdgeInsets.symmetric(horizontal: 14.w),
  53. child: DashedLine(
  54. height: 1.w,
  55. color: '#CCCCCC'.color,
  56. dashWidth: 3.w,
  57. dashSpace: 3.w,
  58. ),
  59. ),
  60. buildContent2View(),
  61. SizedBox(height: 96.w),
  62. buildAppLogoView(),
  63. SizedBox(height: 16.w),
  64. ],
  65. ),
  66. );
  67. }
  68. Widget buildAppLogoView() {
  69. return Row(
  70. mainAxisAlignment: MainAxisAlignment.center,
  71. children: [
  72. Assets.images.iconLogo.image(width: 28.w, height: 28.w),
  73. SizedBox(width: 6.w),
  74. Column(
  75. crossAxisAlignment: CrossAxisAlignment.start,
  76. children: [
  77. Text(StringName.appName,
  78. style: TextStyle(
  79. fontSize: 12.sp,
  80. fontWeight: FontWeight.bold,
  81. color: ColorName.black)),
  82. SizedBox(height: 2.w),
  83. Text(StringName.trackStayShareLogoDesc,
  84. style: TextStyle(fontSize: 9.sp, color: '#74839C'.color))
  85. ],
  86. )
  87. ],
  88. );
  89. }
  90. Widget buildContent2View() {
  91. return Container(
  92. width: double.infinity,
  93. padding: EdgeInsets.symmetric(horizontal: 20.w, vertical: 20.w),
  94. decoration: BoxDecoration(
  95. color: ColorName.white, borderRadius: BorderRadius.circular(14.w)),
  96. child: Column(
  97. children: [
  98. _buildSituationItem(
  99. Assets.images.iconSharePhone.provider(),
  100. StringName.trackDailySummaryPhone,
  101. trackDailySummary.phoneSituation,
  102. isShowDivider: trackDailySummary.stayLongest != null),
  103. _buildSituationItem(Assets.images.iconShareStay.provider(),
  104. StringName.trackDailySummaryStay, trackDailySummary.stayLongest,
  105. isShowDivider:
  106. trackDailySummary.trackSituation?.isNotEmpty == true),
  107. _buildDailyTrack()
  108. ],
  109. ),
  110. );
  111. }
  112. Widget _buildDailyTrack() {
  113. if (trackDailySummary.trackSituation?.isNotEmpty == true) {
  114. return SizedBox(
  115. width: double.infinity,
  116. child: Column(
  117. crossAxisAlignment: CrossAxisAlignment.start,
  118. children: [
  119. Row(children: [
  120. Assets.images.iconShareTrackDetail
  121. .image(width: 15.w, height: 15.w),
  122. SizedBox(width: 4.w),
  123. Text(StringName.trackDailySummarytrack,
  124. style: TextStyle(
  125. fontSize: 13.sp,
  126. color: '#333333'.color,
  127. fontWeight: FontWeight.bold)),
  128. ]),
  129. SizedBox(height: 8.w),
  130. Text(
  131. trackDailySummary.trackSituation ?? '',
  132. style: TextStyle(fontSize: 11.sp, color: '#666666'.color),
  133. ),
  134. SizedBox(height: 12.w),
  135. ],
  136. ),
  137. );
  138. }
  139. return SizedBox.shrink();
  140. }
  141. Widget _buildSituationItem(
  142. ImageProvider icon, String title, TrackSummary? summary,
  143. {bool isShowDivider = true}) {
  144. if (summary == null) {
  145. return SizedBox.shrink();
  146. }
  147. return SizedBox(
  148. width: double.infinity,
  149. child: Column(
  150. crossAxisAlignment: CrossAxisAlignment.start,
  151. children: [
  152. Row(children: [
  153. Image(image: icon, width: 15.w, height: 15.w),
  154. SizedBox(width: 4.w),
  155. Text(title,
  156. style: TextStyle(
  157. fontSize: 13.sp,
  158. color: '#333333'.color,
  159. fontWeight: FontWeight.bold)),
  160. ]),
  161. SizedBox(height: 8.w),
  162. RichTextReplace(
  163. text: summary.text,
  164. items: summary.items,
  165. defaultStyle: TextStyle(fontSize: 11.sp, color: '#666666'.color),
  166. replacedStyle: TextStyle(
  167. fontWeight: FontWeight.bold,
  168. fontSize: 11.sp,
  169. color: '#333333'.color)),
  170. SizedBox(height: 16.w),
  171. Visibility(
  172. visible: isShowDivider,
  173. child: Container(
  174. width: double.infinity,
  175. height: 1.w,
  176. color: '#EEEEEE'.color,
  177. ),
  178. ),
  179. Visibility(visible: isShowDivider, child: SizedBox(height: 16.w)),
  180. ],
  181. ),
  182. );
  183. }
  184. Widget buildContent1View() {
  185. return Container(
  186. decoration: BoxDecoration(
  187. color: ColorName.white,
  188. borderRadius: BorderRadius.circular(14.w),
  189. border: Border.all(color: ColorName.white, width: 2.w),
  190. image: DecorationImage(
  191. image: Assets.images.bgTrackReportUser.provider())),
  192. width: double.infinity,
  193. height: 95.w,
  194. child: Stack(
  195. children: [
  196. Positioned(
  197. top: 0,
  198. bottom: 0,
  199. right: 32.w,
  200. child: Column(
  201. crossAxisAlignment: CrossAxisAlignment.start,
  202. mainAxisAlignment: MainAxisAlignment.center,
  203. children: [
  204. Text(DateUtil.getDayOfMonth(day),
  205. style: TextStyle(
  206. fontFamily: FontFamily.oppoSans,
  207. fontSize: 36.w,
  208. fontWeight: FontWeight.bold,
  209. height: 1)),
  210. SizedBox(height: 4.w),
  211. Row(
  212. children: [
  213. Text(
  214. '${DateUtil.fromMillisecondsSinceEpoch("yyyy/MM", day)} ${DateUtil.getWeekday(day)}',
  215. style: TextStyle(
  216. fontSize: 11.sp,
  217. color: '#666666'.color,
  218. height: 1)),
  219. ],
  220. )
  221. ],
  222. ),
  223. )
  224. ],
  225. ),
  226. );
  227. }
  228. Widget _buildShareAvatarView() {
  229. return Positioned(
  230. left: 54.w,
  231. top: 118.w,
  232. child: Column(
  233. children: [
  234. Container(
  235. width: 68.w,
  236. height: 68.w,
  237. decoration: BoxDecoration(
  238. shape: BoxShape.circle,
  239. border: Border.all(color: '#A362FF'.color, width: 2.w),
  240. ),
  241. child: buildCustomAvatarView(
  242. size: double.infinity,
  243. avatar: userInfo.avatar ?? '',
  244. ),
  245. ),
  246. SizedBox(height: 6.w),
  247. Text(getUserName(userInfo.phoneNumber),
  248. style: TextStyle(
  249. fontSize: 12.sp,
  250. color: '#333333'.color,
  251. fontWeight: FontWeight.w500))
  252. ],
  253. ),
  254. );
  255. }
  256. String getUserName(String phone) {
  257. if (phone.length > 4) {
  258. phone = phone.substring(phone.length - 4);
  259. }
  260. return '${StringName.mineAccountLoggedDesc}$phone';
  261. }
  262. Widget buildRobotView() {
  263. return Positioned(
  264. top: 8.w,
  265. right: 6.w,
  266. child: Assets.images.imgTrackReportRobot
  267. .image(width: 150.w, height: 150.w));
  268. }
  269. Widget buildShareTitleView() {
  270. return Positioned(
  271. left: 23.w,
  272. top: 31.w,
  273. child: Column(
  274. crossAxisAlignment: CrossAxisAlignment.start,
  275. children: [
  276. Assets.images.imgTrackReportTitle.image(height: 57.w),
  277. Row(
  278. children: [
  279. if (trackDailySummary.showTrackSituation &&
  280. trackDailySummary.trackSituation?.isNotEmpty == true)
  281. _buildTitle(StringName.trackDailySummarytrack),
  282. if (trackDailySummary.phoneSituation != null)
  283. _buildTitle(StringName.trackDailySummaryPhone),
  284. if (trackDailySummary.stayLongest != null)
  285. _buildTitle(StringName.trackStayLongestPlace),
  286. ],
  287. )
  288. ],
  289. ),
  290. );
  291. }
  292. Widget _buildTitle(String title) {
  293. return Container(
  294. margin: EdgeInsets.only(right: 6.w),
  295. padding: EdgeInsets.symmetric(horizontal: 6.w, vertical: 4.w),
  296. decoration: BoxDecoration(
  297. color: '#A362FF'.color, borderRadius: BorderRadius.circular(100.w)),
  298. child: Text(title,
  299. style:
  300. TextStyle(fontSize: 10.sp, color: ColorName.white, height: 1)));
  301. }
  302. }