track_share_view.dart 11 KB

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