track_share_view.dart 10 KB

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