track_day_detail_view.dart 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  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_view.dart';
  8. import 'package:location/data/bean/track_days.dart';
  9. import 'package:location/module/track/track_day_detail/time_proportion/track_time_pie_chat.dart';
  10. import 'package:location/module/track/track_day_detail/track_daily_item.dart';
  11. import 'package:location/module/track/track_day_detail/track_day_detail_controller.dart';
  12. import 'package:location/module/track/track_status.dart';
  13. import 'package:location/resource/assets.gen.dart';
  14. import 'package:location/resource/colors.gen.dart';
  15. import 'package:location/resource/string.gen.dart';
  16. import 'package:location/utils/common_expand.dart';
  17. class TrackDayDetailView extends BaseView<TrackDayDetailController> {
  18. late final String trackTag;
  19. TrackDayDetailView(TrackDays days, {super.key, bool isExpand = false}) {
  20. trackTag = days.day;
  21. Get.lazyPut(() => TrackDayDetailController(days, isExpand),
  22. tag: trackTag, fenix: true);
  23. }
  24. @override
  25. TrackDayDetailController get controller =>
  26. Get.find<TrackDayDetailController>(tag: trackTag);
  27. @override
  28. Widget buildBody(BuildContext context) {
  29. return Obx(() {
  30. return Visibility(
  31. visible: controller.isRequested,
  32. child: _buildTrackDetailView(),
  33. );
  34. });
  35. }
  36. Widget _buildTrackDetailView() {
  37. return Obx(() {
  38. if (controller.trackNoData) {
  39. return _buildTrackNoData();
  40. }
  41. return _buildTrackListView();
  42. });
  43. }
  44. Widget _buildTrackListView() {
  45. return Stack(
  46. children: [
  47. CustomScrollView(
  48. slivers: [
  49. buildSliverHistoryTrack(),
  50. SliverToBoxAdapter(
  51. child: Container(
  52. height: 8.w,
  53. color: '#F8F5FF'.color,
  54. )),
  55. SliverToBoxAdapter(
  56. child: buildProportionDurationView(),
  57. )
  58. ],
  59. ),
  60. _buildFoldBtn(),
  61. ],
  62. );
  63. }
  64. Widget _buildFoldContentView() {
  65. return Obx(() {
  66. return Column(
  67. crossAxisAlignment: CrossAxisAlignment.start,
  68. children: [
  69. Builder(builder: (context) {
  70. if (controller.expandSituation != null) {
  71. if (controller.expandSituation!.first == TrackExpandType.error ||
  72. controller.expandSituation!.first ==
  73. TrackExpandType.errorNow) {
  74. return buildErrorTrackDailyItem(
  75. controller.expandSituation!.second,
  76. contentPadding: EdgeInsets.only(top: 46.w, bottom: 12.w));
  77. } else {
  78. return buildStayTrackDailyItem(
  79. controller.expandSituation!.second,
  80. contentPadding: EdgeInsets.only(top: 35.w));
  81. }
  82. } else {
  83. return SizedBox.shrink();
  84. }
  85. }),
  86. if (controller.expandSituation != null &&
  87. (controller.expandSituation?.first == TrackExpandType.error ||
  88. controller.expandSituation?.first == TrackExpandType.stay))
  89. buildEndPoint(controller.expandSituation!.second)
  90. ],
  91. );
  92. });
  93. }
  94. Widget _buildTrackNoData() {
  95. return Column(
  96. children: [
  97. SizedBox(height: 0.048.sh),
  98. Assets.images.imgTrackNoData.image(width: 78.5.w),
  99. SizedBox(height: 7.w),
  100. Text(StringName.trackDetailNoData,
  101. style: TextStyle(fontSize: 11.sp, color: ColorName.black60))
  102. ],
  103. );
  104. }
  105. Widget _buildFoldBtn() {
  106. return Obx(() {
  107. return Visibility(
  108. visible: !controller.trackNoData && !controller.isHideExpand,
  109. child: Positioned(
  110. top: 2.w,
  111. right: 5.w,
  112. child: GestureDetector(
  113. behavior: HitTestBehavior.translucent,
  114. onTap: controller.onTrackDetailFoldClick,
  115. child: Container(
  116. padding: EdgeInsets.symmetric(horizontal: 5.w, vertical: 8.w),
  117. child: Obx(() {
  118. return Row(
  119. crossAxisAlignment: controller.isExpanded
  120. ? CrossAxisAlignment.end
  121. : CrossAxisAlignment.center,
  122. children: [
  123. Text(
  124. controller.isExpanded
  125. ? StringName.trackDetailExpand
  126. : StringName.trackDetailFold,
  127. style: TextStyle(fontSize: 10.sp, color: '#666666'.color),
  128. ),
  129. SizedBox(width: 1.w),
  130. Transform.rotate(
  131. angle: controller.isExpanded ? 3.1416 : 0,
  132. child: Assets.images.iconTrackDetailTimeBaseArrow
  133. .image(width: 10.w, height: 10.w),
  134. )
  135. ],
  136. );
  137. }),
  138. ),
  139. ),
  140. ),
  141. );
  142. });
  143. }
  144. Widget buildProportionDurationView() {
  145. return Column(
  146. children: [
  147. Container(
  148. width: double.infinity,
  149. height: 293.w,
  150. padding: EdgeInsets.all(12.w),
  151. child: Stack(
  152. children: [
  153. Text(StringName.trackDetailTimeProportion,
  154. style: TextStyle(
  155. fontSize: 13.sp,
  156. color: '#333333'.color,
  157. fontWeight: FontWeight.bold)),
  158. _buildPieChatView()
  159. ],
  160. ),
  161. ),
  162. Container(
  163. height: 8.w,
  164. width: double.infinity,
  165. color: '#F8F5FF'.color,
  166. )
  167. ],
  168. );
  169. }
  170. Widget _buildPieChatView() {
  171. return Obx(() {
  172. if (controller.pieChatData.isEmpty) {
  173. return SizedBox.shrink();
  174. }
  175. return Align(
  176. alignment: Alignment.center,
  177. child: TrackTimePieChat(pieData: controller.pieChatData));
  178. });
  179. }
  180. Widget buildSliverHistoryTrack() {
  181. return Obx(() {
  182. if (controller.isExpanded) {
  183. return SliverPadding(
  184. padding: EdgeInsets.only(top: 20.w, bottom: 12.w),
  185. sliver: SliverList.builder(
  186. itemBuilder: buildHistoryTrackItem,
  187. itemCount: controller.trackDailyList.length),
  188. );
  189. } else {
  190. return SliverPadding(
  191. padding: EdgeInsets.only(
  192. top: 20.w, bottom: 12.w, left: 12.w, right: 12.w),
  193. sliver: SliverToBoxAdapter(
  194. child: _buildFoldContentView(),
  195. ));
  196. }
  197. });
  198. }
  199. Widget buildHistoryTrackItem(BuildContext context, int index) {
  200. return buildTrackDailyItem(controller.trackDailyList[index],
  201. index == controller.trackDailyList.length - 1);
  202. }
  203. }