track_detail_page.dart 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. import 'package:flutter/cupertino.dart';
  2. import 'package:flutter/material.dart';
  3. import 'package:flutter/src/widgets/framework.dart';
  4. import 'package:flutter_screenutil/flutter_screenutil.dart';
  5. import 'package:get/get.dart';
  6. import 'package:get/get_core/src/get_main.dart';
  7. import 'package:location/base/base_page.dart';
  8. import 'package:location/module/track/track_detail/track_detail_controller.dart';
  9. import 'package:location/resource/assets.gen.dart';
  10. import 'package:location/resource/colors.gen.dart';
  11. import 'package:location/resource/string.gen.dart';
  12. import 'package:location/router/app_pages.dart';
  13. import 'package:location/utils/common_expand.dart';
  14. import 'package:location/utils/date_util.dart';
  15. import 'package:location/widget/common_view.dart';
  16. import '../../../data/bean/atmob_track_point.dart';
  17. import '../../../utils/dashed_line_painter.dart';
  18. class TrackDetailPage extends BasePage<TrackDetailController> {
  19. const TrackDetailPage({super.key});
  20. static void start(List<AtmobTrackPoint>? points) {
  21. Get.toNamed(RoutePath.trackDetail, arguments: points);
  22. }
  23. @override
  24. Widget buildBody(BuildContext context) {
  25. return Column(
  26. children: [
  27. CommonView.buildAppBar(StringName.traceDetail,
  28. titleCenter: false, backOnTap: controller.back),
  29. SizedBox(height: 12.w),
  30. buildSearchView(),
  31. Expanded(
  32. child: CustomScrollView(slivers: [
  33. SliverToBoxAdapter(
  34. child: Container(
  35. padding: EdgeInsets.only(left: 24.w, top: 32.w, bottom: 13.w),
  36. child: Text(
  37. StringName.traceDetailTitle,
  38. style: TextStyle(
  39. fontSize: 15.sp,
  40. color: '#202020'.color,
  41. fontWeight: FontWeight.bold),
  42. ),
  43. ),
  44. ),
  45. Obx(() {
  46. return SliverList.builder(
  47. itemBuilder: buildTrackItem,
  48. itemCount: controller.pointList.length);
  49. })
  50. ]))
  51. ],
  52. );
  53. }
  54. Widget buildSearchView() {
  55. return Container(
  56. width: double.infinity,
  57. height: 52.w,
  58. margin: EdgeInsets.symmetric(horizontal: 12.w),
  59. decoration: BoxDecoration(
  60. color: ColorName.white,
  61. borderRadius: BorderRadius.circular(12.w),
  62. border: Border.all(color: '#333738'.color, width: 1.w),
  63. ),
  64. child: Row(
  65. children: [
  66. SizedBox(width: 16.w),
  67. Assets.images.iconTrackSearch.image(width: 22.w, height: 22.w),
  68. SizedBox(width: 6.w),
  69. Expanded(
  70. child: TextField(
  71. onChanged: (txt) {
  72. controller.onSearch(txt);
  73. },
  74. style: TextStyle(fontSize: 15.sp, color: ColorName.black90),
  75. controller: controller.searchController,
  76. maxLines: 1,
  77. maxLength: 30,
  78. keyboardType: TextInputType.text,
  79. textAlignVertical: TextAlignVertical.center,
  80. textInputAction: TextInputAction.next,
  81. decoration: InputDecoration(
  82. hintText: StringName.traceDetailSearchHint,
  83. counterText: '',
  84. hintStyle:
  85. TextStyle(fontSize: 15.sp, color: "#A7A7A7".toColor()),
  86. contentPadding: const EdgeInsets.all(0),
  87. border:
  88. const OutlineInputBorder(borderSide: BorderSide.none))),
  89. ),
  90. SizedBox(width: 16.w),
  91. Obx(() {
  92. return GestureDetector(
  93. onTap: controller.onClearSearchTxt,
  94. child: Visibility(
  95. visible: controller.searchTxt.isNotEmpty,
  96. child: Assets.images.iconTrackSearchClear
  97. .image(width: 20.w, height: 20.w)),
  98. );
  99. }),
  100. SizedBox(width: 16.w),
  101. ],
  102. ),
  103. );
  104. }
  105. Widget buildTrackItem(BuildContext context, int index) {
  106. final item = controller.pointList[index];
  107. bool isFirst = index == 0;
  108. bool isLast = index == controller.pointList.length - 1;
  109. bool isFirstPoint = item.traceType == TrackDetailController.lineStart;
  110. bool isLastPoint = item.traceType == TrackDetailController.lineEnd;
  111. return Row(
  112. children: [
  113. SizedBox(width: 24.w),
  114. Column(
  115. children: [
  116. Visibility(
  117. maintainSize: true,
  118. maintainAnimation: true,
  119. maintainState: true,
  120. visible: !isFirst,
  121. child: Padding(
  122. padding: EdgeInsets.only(top: 1.w),
  123. child: VerticalDashedLine(
  124. dashSpace: 2.w,
  125. color: '#F0F0F0'.color,
  126. height: 35.w,
  127. dashLength: 3.w,
  128. strokeWidth: 1.w),
  129. )),
  130. SizedBox(height: 8.w),
  131. SizedBox(
  132. width: 20.w,
  133. height: 20.w,
  134. child: Builder(builder: (context) {
  135. if (isFirstPoint) {
  136. return Container(
  137. margin: EdgeInsets.all(3.5.w),
  138. decoration: BoxDecoration(
  139. border:
  140. Border.all(color: '#12C172'.color, width: 2.w),
  141. shape: BoxShape.circle));
  142. } else if (isLastPoint) {
  143. return Container(
  144. margin: EdgeInsets.all(3.5.w),
  145. decoration: BoxDecoration(
  146. border:
  147. Border.all(color: '#F3353A'.color, width: 2.w),
  148. shape: BoxShape.circle));
  149. } else {
  150. return Assets.images.iconTrackLocation
  151. .image(width: double.infinity, height: double.infinity);
  152. }
  153. }),
  154. ),
  155. SizedBox(height: 8.w),
  156. Visibility(
  157. maintainSize: true,
  158. maintainAnimation: true,
  159. maintainState: true,
  160. visible: !isLastPoint,
  161. child: VerticalDashedLine(
  162. dashSpace: 2.w,
  163. dashLength: 3.w,
  164. color: '#F0F0F0'.color,
  165. height: 35.w,
  166. strokeWidth: 1.w)),
  167. ],
  168. ),
  169. SizedBox(width: 8.w),
  170. Expanded(
  171. child: Column(
  172. crossAxisAlignment: CrossAxisAlignment.start,
  173. children: [
  174. Text(
  175. item.addr ?? '',
  176. style: TextStyle(
  177. fontSize: 16.sp,
  178. color: '#404040'.color,
  179. fontWeight: FontWeight.bold),
  180. ),
  181. SizedBox(height: 4.w),
  182. Text(
  183. DateUtil.fromMillisecondsSinceEpoch(
  184. "yyyy年MM月dd日 HH:mm", item.time),
  185. style: TextStyle(fontSize: 13.sp, color: '#A7A7A7'.color)),
  186. ],
  187. ),
  188. ),
  189. SizedBox(width: 12.w),
  190. ],
  191. );
  192. }
  193. }