map_list_view.dart 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. import 'package:flutter/material.dart';
  2. import 'package:get/get.dart';
  3. import '../../model.dart';
  4. import '../../generated/assets.dart';
  5. import '../../screen.dart';
  6. import '../../service/mock.dart';
  7. import '../../widget/app_dialog.dart';
  8. import '../../widget/app_net_image.dart';
  9. import '../../widget/hard_level.dart';
  10. import '../../widget/page_frame.dart';
  11. import 'map_list_controller.dart';
  12. class MapListView extends GetView<MapListController> {
  13. const MapListView({super.key});
  14. static Bindings bindings() {
  15. return BindingsBuilder(() {
  16. Get.lazyPut<MapListController>(() => MapListController());
  17. });
  18. }
  19. @override
  20. Widget build(BuildContext context) {
  21. // final PageTopController c = Get.find();
  22. return PageFrame(child: _wBody(context));
  23. }
  24. Widget _wBody(BuildContext context) {
  25. return Obx(() {
  26. final data = controller.mapList;
  27. return Container(
  28. margin: const EdgeInsets.symmetric(horizontal: 18, vertical: 18),
  29. width: context.width,
  30. height: context.height,
  31. decoration: const BoxDecoration(
  32. color: Colors.white,
  33. borderRadius: BorderRadius.all(Radius.circular(12.0)),
  34. // border: Border.all(width: 1, color: Colors.red),
  35. ),
  36. child: Column(children: [
  37. Padding(
  38. padding: const EdgeInsets.only(left: 30, top: 15),
  39. child: Row(
  40. children: [
  41. const Icon(
  42. Icons.circle,
  43. size: 16,
  44. color: Color(0xff1a82c0),
  45. ),
  46. const SizedBox(width: 6),
  47. Text(
  48. '地图列表 ( ${data.length} )',
  49. style: const TextStyle(
  50. color: Colors.black,
  51. fontSize: 15,
  52. fontWeight: FontWeight.w500,
  53. ),
  54. textAlign: TextAlign.start,
  55. maxLines: 1,
  56. overflow: TextOverflow.ellipsis,
  57. ),
  58. ],
  59. ),
  60. ),
  61. Expanded(
  62. child: Row(
  63. children: [
  64. // Container(
  65. // margin: const EdgeInsets.symmetric(horizontal: 18, vertical: 18),
  66. // width: 1.68.wp,
  67. // // child: Image.asset(Assets.imagesIcArrowLeft),
  68. // ),
  69. Expanded(
  70. child: Container (
  71. // color: Colors.blue,
  72. margin: const EdgeInsets.only(
  73. left: 30, right: 30, top: 10, bottom: 20),
  74. child: _dataView(context, data,
  75. controller.mapInfoListScrollController),
  76. )
  77. ),
  78. // Container(
  79. // margin: const EdgeInsets.symmetric(horizontal: 18, vertical: 18),
  80. // width: 1.68.wp,
  81. // // child: Image.asset(Assets.imagesIcArrowRight),
  82. // ),
  83. ],
  84. ),
  85. )
  86. ]));
  87. });
  88. }
  89. Widget _dataView(BuildContext context, List<MapInfo> data,
  90. ScrollController scrollController) {
  91. return GridView.builder(
  92. padding: const EdgeInsets.all(0.0),
  93. itemCount: data.length,
  94. controller: scrollController,
  95. gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
  96. //设置列数
  97. crossAxisCount: 5,
  98. //设置横向间距
  99. crossAxisSpacing: 30,
  100. //设置主轴间距
  101. mainAxisSpacing: 30,
  102. //设置宽高比例
  103. childAspectRatio: 0.71),
  104. itemBuilder: (context, i) {
  105. return GalleryCardWidget(data: data[i]);
  106. });
  107. }
  108. }
  109. class GalleryCardWidget extends GetView<MapListController> {
  110. final MapInfo data;
  111. const GalleryCardWidget({super.key, required this.data});
  112. void onTap() async {
  113. var pin = '';
  114. var isCancel = false;
  115. if (data.needPin) {
  116. isCancel = true;
  117. await Get.dialog(AppDialog(
  118. title: const Text('请输入PIN码'),
  119. content: SizedBox(
  120. width: 50.0.wp,
  121. child: TextField(
  122. onChanged: (v) {
  123. pin = v;
  124. },
  125. maxLines: 1,
  126. maxLength: 8,
  127. style: const TextStyle(color: Colors.white),
  128. )),
  129. onCancel: () => Get.back(),
  130. onConfirm: () {
  131. isCancel = false;
  132. Get.back();
  133. },
  134. ));
  135. }
  136. // if (!isCancel) {
  137. // Get.to(() => ActivityListView(
  138. // mapName: data.name,
  139. // mapId: data.id,
  140. // pin: pin,
  141. // isDirectIn: false,
  142. // ));
  143. // }
  144. }
  145. @override
  146. Widget build(BuildContext context) {
  147. return GestureDetector(
  148. onTap: data.isOpen ? onTap : null,
  149. child: Card(
  150. color: Colors.white,
  151. surfaceTintColor: Colors.white,
  152. shape: const RoundedRectangleBorder(
  153. borderRadius: BorderRadius.all(Radius.circular(5.44))),
  154. clipBehavior: Clip.antiAlias,
  155. child: Column(
  156. crossAxisAlignment: CrossAxisAlignment.start,
  157. children: [
  158. AspectRatio(aspectRatio: 1, child: wImage()),
  159. Expanded(
  160. child: Padding(
  161. padding: const EdgeInsets.all(6.6),
  162. child: Column(
  163. mainAxisAlignment: MainAxisAlignment.start,
  164. crossAxisAlignment: CrossAxisAlignment.start,
  165. children: [
  166. Text(
  167. data.name,
  168. style: const TextStyle(
  169. fontSize: 13.6,
  170. fontWeight: FontWeight.w500,
  171. ),
  172. textAlign: TextAlign.start,
  173. maxLines: 1,
  174. overflow: TextOverflow.ellipsis,
  175. ),
  176. const Text(
  177. "边走边打卡",
  178. style: TextStyle(
  179. color: Color(0xffc6c6c6),
  180. fontSize: 11,
  181. fontWeight: FontWeight.w500,
  182. ),
  183. textAlign: TextAlign.start,
  184. maxLines: 1,
  185. overflow: TextOverflow.ellipsis,
  186. ),
  187. const SizedBox(height: 3),
  188. Row(
  189. crossAxisAlignment: CrossAxisAlignment.end,
  190. mainAxisAlignment: MainAxisAlignment.spaceBetween,
  191. children: [
  192. Row(
  193. crossAxisAlignment: CrossAxisAlignment.center,
  194. mainAxisAlignment: MainAxisAlignment.start,
  195. children: [
  196. Image.asset(Assets.imagesIcRuler,
  197. height: 1.0.wp),
  198. const SizedBox(width: 1),
  199. const Text('1:1000',
  200. style: TextStyle(
  201. color: Colors.black, fontSize: 10)),
  202. const SizedBox(width: 6),
  203. ],
  204. ),
  205. Row(
  206. crossAxisAlignment: CrossAxisAlignment.center,
  207. mainAxisAlignment: MainAxisAlignment.end,
  208. children: [
  209. const Icon(
  210. Icons.location_on,
  211. size: 13,
  212. color: Color(0xffaaaaaa),
  213. ),
  214. const SizedBox(width: 1),
  215. getDistanceText(data),
  216. ],
  217. ),
  218. // HardLevel(data.level),
  219. ],
  220. )
  221. ],
  222. ))),
  223. ],
  224. ),
  225. ),
  226. );
  227. }
  228. Widget wImage() {
  229. return Stack(
  230. children: [
  231. SizedBox(
  232. height: double.infinity,
  233. // height: 12.85.wp,
  234. child: AppNetImage(netImage: data.image, fit: BoxFit.fitHeight)),
  235. data.isOpen
  236. ? const SizedBox()
  237. : Container(
  238. width: double.infinity,
  239. height: double.infinity,
  240. color: Colors.white.withAlpha(178),
  241. alignment: Alignment.center,
  242. child: const Text(
  243. '待开放',
  244. style: TextStyle(color: Color(0xffff6203), fontSize: 15.24),
  245. ),
  246. )
  247. ],
  248. );
  249. }
  250. Widget getDistanceText(MapInfo data) {
  251. return Obx(() {
  252. final myPosition = controller.myPosition;
  253. var str = '--';
  254. if (myPosition != null) {
  255. final p = data.position;
  256. str = p.distance(myPosition).toString();
  257. }
  258. return Text(str,
  259. style: const TextStyle(color: Colors.black, fontSize: 10));
  260. });
  261. }
  262. }
  263. void main() {
  264. Mock.initServices();
  265. PageTopController pageTopController = Get.put(PageTopController());
  266. // pageTopController.mapName.value = "济南泉城公园";
  267. // pageTopController.mapName.value = "济南森林公园风景区定向运动济南森林公园风景区定向运动";
  268. Get.put(MapListController());
  269. runPreview(const MapListView());
  270. }