track_share_view.dart 9.9 KB

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