map_page.dart 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. import 'package:common_pub/model.dart';
  2. import 'package:common_pub/model/position.dart' as m;
  3. import 'package:common_pub/ui/app_net_image.dart';
  4. import 'package:track_common/service/map_watch.dart';
  5. import 'package:track_common/widget/prelude.dart';
  6. import '../../../model/map_info.dart';
  7. import '../../../utils.dart';
  8. import '../../../widget.dart';
  9. abstract class MapPageController extends GetxController {
  10. @override
  11. void onInit() {
  12. super.onInit();
  13. mapGetMore();
  14. }
  15. Future<List<MapInfo>> getMapList(int limit, int offset);
  16. void afterTopMap();
  17. int get selectedMapId {
  18. return Get.find<MapWatchService>().instance?.id ?? 0;
  19. }
  20. set selectedMap(MapInfo map);
  21. void onTapMap(MapInfo info) {
  22. selectedMap = info;
  23. Get.find<MapWatchService>().setMap(info).then((value) => afterTopMap());
  24. }
  25. Future<void> mapGetMore() async {
  26. if (isMapGetMoreLoading.value) {
  27. return;
  28. }
  29. isMapGetMoreLoading.value = true;
  30. await tryApi(() async {
  31. final r = await getMapList(20, mapList.length);
  32. mapList.addAll(r);
  33. return;
  34. }, onFinally: () {
  35. isMapGetMoreLoading.value = false;
  36. });
  37. mapListScrollController.addListener(() {
  38. if (mapListScrollController.position.pixels ==
  39. mapListScrollController.position.maxScrollExtent) {
  40. //达到最大滚动位置
  41. mapGetMore();
  42. }
  43. });
  44. }
  45. final mapList = <MapInfo>[].obs;
  46. final isMapGetMoreLoading = false.obs;
  47. final mapListScrollController = ScrollController();
  48. final Rx<m.Position?> position = Rx(null);
  49. }
  50. class MapPage extends GetView<MapPageController> {
  51. const MapPage({super.key});
  52. @override
  53. Widget build(BuildContext context) {
  54. return Container(
  55. width: double.infinity,
  56. height: double.infinity,
  57. margin: const EdgeInsets.all(20),
  58. padding: const EdgeInsets.fromLTRB(58, 28, 58, 28),
  59. decoration: BoxDecoration(
  60. color: Colors.white, borderRadius: BorderRadius.circular(16)),
  61. child: Column(
  62. children: [
  63. const Row(
  64. children: [
  65. TitlePoint(),
  66. Text(' 地图列表'),
  67. ],
  68. ),
  69. Expanded(
  70. child: Obx(() => GridView.builder(
  71. itemCount: controller.mapList.length,
  72. controller: controller.mapListScrollController,
  73. scrollDirection: Axis.horizontal,
  74. gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
  75. //设置列数
  76. crossAxisCount: 2,
  77. //设置横向间距
  78. crossAxisSpacing: 10,
  79. //设置主轴间距
  80. mainAxisSpacing: 10,
  81. childAspectRatio: 1.3),
  82. itemBuilder: (context, i) {
  83. return Obx(() {
  84. final data = controller.mapList[i];
  85. final s = controller.selectedMapId == data.id;
  86. return GalleryCardWidget(
  87. data: data,
  88. position: controller.position.value,
  89. isSelected: s);
  90. });
  91. })))
  92. ],
  93. ),
  94. );
  95. }
  96. }
  97. class GalleryCardWidget extends GetView<MapPageController> {
  98. final MapInfo data;
  99. final m.Position? position;
  100. final bool isSelected;
  101. const GalleryCardWidget(
  102. {super.key,
  103. required this.data,
  104. required this.position,
  105. required this.isSelected});
  106. void onTap(MapInfo mapInfo) {
  107. controller.onTapMap(mapInfo);
  108. }
  109. @override
  110. Widget build(BuildContext context) {
  111. var distance = '--';
  112. if (data.distance != null) {
  113. distance = data.distance!.toString();
  114. }
  115. return GestureDetector(
  116. onTap: () => onTap(data),
  117. child: Card(
  118. color: Colors.white,
  119. shadowColor: isSelected ? Colors.red : null,
  120. surfaceTintColor: Colors.white,
  121. shape: const RoundedRectangleBorder(
  122. borderRadius: BorderRadius.all(Radius.circular(5.44))),
  123. clipBehavior: Clip.antiAlias,
  124. elevation: isSelected ? 8 : 4,
  125. child: Column(
  126. crossAxisAlignment: CrossAxisAlignment.start,
  127. children: [
  128. AspectRatio(
  129. aspectRatio: 1.1,
  130. child:
  131. AppNetImage(netImage: data.image, fit: BoxFit.fitHeight)),
  132. Expanded(
  133. child: Padding(
  134. padding: const EdgeInsets.all(6),
  135. child: Column(
  136. mainAxisAlignment: MainAxisAlignment.spaceEvenly,
  137. crossAxisAlignment: CrossAxisAlignment.start,
  138. children: [
  139. Text(
  140. data.name,
  141. style: const TextStyle(
  142. fontSize: 13.5,
  143. fontWeight: FontWeight.w500,
  144. ),
  145. textAlign: TextAlign.start,
  146. maxLines: 1,
  147. overflow: TextOverflow.ellipsis,
  148. ),
  149. Text(
  150. data.description,
  151. style: const TextStyle(
  152. fontSize: 10,
  153. color: Color(0xffc6c6c6),
  154. ),
  155. textAlign: TextAlign.start,
  156. maxLines: 1,
  157. overflow: TextOverflow.ellipsis,
  158. ),
  159. const Spacer(),
  160. DefaultTextStyle(
  161. style: const TextStyle(
  162. color: Colors.black, fontSize: 10),
  163. child: Row(
  164. crossAxisAlignment: CrossAxisAlignment.end,
  165. mainAxisAlignment: MainAxisAlignment.spaceBetween,
  166. children: [
  167. Image.asset(Assets.imagesIcMapScale,
  168. package: package, height: 9.6),
  169. Text(' 1:${data.mapScaleNumber}'),
  170. const Spacer(),
  171. Image.asset(Assets.imagesIcLocation,
  172. package: package, height: 9.6),
  173. Text(' $distance'),
  174. ],
  175. ))
  176. ],
  177. ))),
  178. ],
  179. ),
  180. ),
  181. );
  182. }
  183. Widget wImage() {
  184. return Stack(
  185. children: [
  186. SizedBox(
  187. height: double.infinity,
  188. child: AppNetImage(netImage: data.image, fit: BoxFit.fitHeight)),
  189. ],
  190. );
  191. }
  192. }