activity_view.dart 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335
  1. import 'package:flutter/material.dart';
  2. import 'package:get/get.dart';
  3. import 'package:trackoffical_app/utils.dart';
  4. import 'package:trackoffical_app/view/mapto/map_to_controller.dart';
  5. import '../../generated/app_api.pb.dart';
  6. import '../../generated/assets.dart';
  7. import '../../generated/to_app_api.pb.dart';
  8. import '../../screen.dart';
  9. import 'package:trackoffical_app/pb.dart' as pb;
  10. import '../../widget/common.dart';
  11. class ActivityView extends GetView<MapToController> {
  12. const ActivityView({super.key});
  13. // const ActivityView(this.mapActivitySimpleInfo, this.userInfo, {super.key});
  14. // final MapToController mapToController = Get.find();
  15. // final List<pb.MapActivitySimpleInfo> mapActivitySimpleInfo;
  16. // final List<ModelUserInfo> userInfo;
  17. static Bindings bindings() {
  18. return BindingsBuilder(() {
  19. Get.lazyPut<MapToController>(() => MapToController());
  20. });
  21. }
  22. @override
  23. Widget build(BuildContext context) {
  24. return Container(
  25. width: 25.69.wp,
  26. height: context.height,
  27. padding: EdgeInsets.symmetric(horizontal: 1.wp, vertical: 1.wp),
  28. decoration: BoxDecoration(
  29. color: Colors.white,
  30. // borderRadius: BorderRadius.circular(8),
  31. // shape: BoxShape.rectangle,
  32. boxShadow: [
  33. BoxShadow(
  34. color: const Color(0x33000000),
  35. offset: Offset(-0.28.wp, 0.21.wp),
  36. blurRadius: 0.42.wp)
  37. ],
  38. ),
  39. child: Column(
  40. mainAxisAlignment: MainAxisAlignment.start,
  41. children: [_wActivitys()],
  42. ),
  43. );
  44. }
  45. Widget _wActivitys() {
  46. // var mapActivitySimpleInfo = mapToController.mapActivitySimpleInfo;
  47. return Obx(() {
  48. return Expanded(
  49. child: ListView.builder(
  50. padding: EdgeInsets.only(top: 0.wp),
  51. // itemCount: mapActivitySimpleInfo.length,
  52. itemCount: controller.toActionInfoList.value.list.length,
  53. itemBuilder: (ctx, i) {
  54. return _wActivityElem(ctx, i);
  55. }));
  56. });
  57. }
  58. Widget _wActivityElem(BuildContext ctx, int i) {
  59. // var info = mapActivitySimpleInfo[i].obs;
  60. var info = controller.toActionInfoList.value.list[i];
  61. var expand = true.obs;
  62. return Obx(() {
  63. return GestureDetector(
  64. // onTap: info.isOpen? ()=>ActivityDetailView.to(info): null,
  65. child: Container(
  66. margin:
  67. EdgeInsets.only(left: 0.wp, right: 0.wp, top: 0.wp, bottom: 1.wp),
  68. // padding: EdgeInsets.only(left: 0.8.wp, right: 0.8.wp, top: 0.8.wp, bottom: 0.8.wp),
  69. padding: EdgeInsets.all(0.8.wp),
  70. decoration: BoxDecoration(
  71. color: const Color(0xffe0e0e0),
  72. borderRadius: BorderRadius.circular(0.35.wp),
  73. ),
  74. child: Column(
  75. children: [
  76. _activityTitle(info, expand),
  77. expand.value ? _activityControl(info) : Container(),
  78. expand.value ? _wUserList() : Container(),
  79. ],
  80. ),
  81. ));
  82. });
  83. }
  84. Widget _activityTitle(ToActionInfo info, var expand) {
  85. return Container(
  86. child: GestureDetector(
  87. onTap: () {
  88. // debugPrint("expand.value = ${expand.value}");
  89. expand.value = !(expand.value);
  90. },
  91. child: Row(
  92. mainAxisAlignment: MainAxisAlignment.start,
  93. crossAxisAlignment: CrossAxisAlignment.center,
  94. children: [
  95. SizedBox(
  96. width: 16.8.wp,
  97. child: Text(info.actName,
  98. softWrap: false,
  99. maxLines: 1,
  100. overflow: TextOverflow.ellipsis,
  101. style: TextStyle(
  102. fontSize: 1.29.wp,
  103. fontWeight: FontWeight.w700,
  104. color: const Color(0xff333333))),
  105. ),
  106. SizedBox(width: 0.3.wp),
  107. Text("(${info.totalControlNum}人)",
  108. style: TextStyle(
  109. fontSize: 1.11.wp,
  110. fontWeight: FontWeight.w500,
  111. color: const Color(0xff333333))),
  112. SizedBox(width: 0.6.wp),
  113. Image.asset(
  114. expand.value ? Assets.imagesIcArrowUp : Assets.imagesIcArrowDown,
  115. height: 0.86.wp,
  116. fit: BoxFit.fitHeight,
  117. ),
  118. ],
  119. ),
  120. ),
  121. );
  122. }
  123. Widget _activityControl(ToActionInfo info) {
  124. return Container(
  125. margin: EdgeInsets.only(top: 0.6.wp),
  126. padding: EdgeInsets.symmetric(vertical: 0.5.wp, horizontal: 1.wp),
  127. decoration: BoxDecoration(
  128. color: Colors.white,
  129. borderRadius: BorderRadius.circular(0.42.wp),
  130. ),
  131. child: Row(
  132. mainAxisAlignment: MainAxisAlignment.spaceBetween,
  133. children: [
  134. Row(
  135. children: [
  136. Text("广播",
  137. style: TextStyle(
  138. fontSize: 1.11.wp,
  139. fontWeight: FontWeight.w500,
  140. color: Colors.black)),
  141. SizedBox(width: 0.5.wp),
  142. Image.asset(
  143. Assets.imagesIcBullhorn,
  144. height: 1.13.wp,
  145. fit: BoxFit.fitHeight,
  146. ),
  147. ],
  148. ),
  149. Row(
  150. children: [
  151. Image.asset(
  152. Assets.imagesIcCp,
  153. height: 1.35.wp,
  154. fit: BoxFit.fitHeight,
  155. ),
  156. SizedBox(width: 0.3.wp),
  157. Text("${info.totalControlNum}"),
  158. ],
  159. ),
  160. Row(
  161. children: [
  162. Text("全部隐藏",
  163. style: TextStyle(
  164. fontSize: 1.11.wp,
  165. fontWeight: FontWeight.w500,
  166. color: Colors.black)),
  167. SizedBox(width: 0.5.wp),
  168. Image.asset(
  169. Assets.imagesIcEye,
  170. height: 1.1.wp,
  171. fit: BoxFit.fitHeight,
  172. ),
  173. ],
  174. ),
  175. ],
  176. ));
  177. }
  178. Widget _wUserList() {
  179. final children = <Widget>[];
  180. return Obx(() {
  181. for (var i = 0; i < controller.userInfoList.length; i++) {
  182. final userInfo = controller.userInfoList[i];
  183. children.add(Container(
  184. height: 6.25.wp,
  185. margin: EdgeInsets.only(top: 0.5.wp),
  186. padding: EdgeInsets.symmetric(vertical: 0.5.wp, horizontal: 0.5.wp),
  187. decoration: BoxDecoration(
  188. color: Colors.white,
  189. borderRadius: BorderRadius.circular(0.42.wp),
  190. ),
  191. child: Column(
  192. mainAxisAlignment: MainAxisAlignment.spaceBetween,
  193. children: [
  194. _wUserInfoRow1(userInfo),
  195. _wUserInfoRow2(userInfo),
  196. _wUserInfoRow3(userInfo),
  197. ],
  198. )));
  199. }
  200. return Column(
  201. children: children,
  202. );
  203. });
  204. }
  205. Widget _wUserInfoRow1(ModelUserInfo userInfo) {
  206. return Row(
  207. mainAxisAlignment: MainAxisAlignment.start,
  208. crossAxisAlignment: CrossAxisAlignment.center,
  209. children: [
  210. wUserMark(userInfo.iUserid!),
  211. SizedBox(width: 0.5.wp),
  212. Text(userInfo.sUserName!,
  213. style: TextStyle(
  214. fontSize: 1.25.wp,
  215. fontWeight: FontWeight.w500,
  216. color: Colors.black)),
  217. SizedBox(width: 0.5.wp),
  218. Text("[${userInfo.sRouteCode}]",
  219. style: TextStyle(
  220. fontSize: 0.97.wp,
  221. fontWeight: FontWeight.w400,
  222. color: Colors.black)),
  223. const Spacer(),
  224. Image.asset(
  225. true ? Assets.imagesIcEye : Assets.imagesIcEyeOff,
  226. height: 1.1.wp,
  227. fit: BoxFit.fitHeight,
  228. ),
  229. SizedBox(width: 0.5.wp),
  230. ],
  231. );
  232. }
  233. Widget _wUserInfoRow2(ModelUserInfo userInfo) {
  234. return Row(
  235. mainAxisAlignment: MainAxisAlignment.spaceAround,
  236. crossAxisAlignment: CrossAxisAlignment.center,
  237. children: [
  238. //待打点位
  239. Container(
  240. width: 7.81.wp,
  241. padding: EdgeInsets.symmetric(vertical: 0.wp, horizontal: 0.6.wp),
  242. decoration: BoxDecoration(
  243. color: const Color(0xff00a0ff),
  244. borderRadius: BorderRadius.circular(0.63.wp)),
  245. child: Text("${userInfo.iNextCPId}号点 (${userInfo.sNextCPCode})",
  246. textAlign: TextAlign.center,
  247. softWrap: false,
  248. maxLines: 1,
  249. overflow: TextOverflow.ellipsis,
  250. style: TextStyle(
  251. fontSize: 0.97.wp,
  252. fontWeight: FontWeight.w400,
  253. color: Colors.white)),
  254. ),
  255. // 心率
  256. Container(
  257. width: 4.67.wp,
  258. padding: EdgeInsets.symmetric(vertical: 0.wp, horizontal: 0.9.wp),
  259. decoration: BoxDecoration(
  260. color: userInfo.iHr!.toHRPColor(),
  261. borderRadius: BorderRadius.circular(0.63.wp)),
  262. child: Row(
  263. mainAxisAlignment: MainAxisAlignment.spaceAround,
  264. children: [
  265. Image.asset(Assets.imagesIcHeart,
  266. height: 0.82.wp, fit: BoxFit.fitHeight),
  267. // SizedBox(width: 0.5.wp),
  268. Text("${userInfo.iHr}",
  269. style: TextStyle(
  270. fontSize: 0.97.wp,
  271. fontWeight: FontWeight.w400,
  272. color: Colors.white)),
  273. ],
  274. )),
  275. //配速
  276. Container(
  277. width: 6.39.wp,
  278. padding: EdgeInsets.symmetric(vertical: 0.wp, horizontal: 0.6.wp),
  279. decoration: BoxDecoration(
  280. color: const Color(0xffff880f),
  281. borderRadius: BorderRadius.circular(0.63.wp)),
  282. child: Text("${userInfo.pacePerKm?.toMinSecondString()}/km",
  283. textAlign: TextAlign.center,
  284. softWrap: false,
  285. maxLines: 1,
  286. overflow: TextOverflow.ellipsis,
  287. style: TextStyle(
  288. fontSize: 0.97.wp,
  289. fontWeight: FontWeight.w400,
  290. color: Colors.white)),
  291. ),
  292. ],
  293. );
  294. }
  295. Widget _wUserInfoRow3(ModelUserInfo userInfo) {
  296. return Row(
  297. mainAxisAlignment: MainAxisAlignment.spaceAround,
  298. crossAxisAlignment: CrossAxisAlignment.center,
  299. children: [
  300. Text("距离 ${userInfo.iDistance!}m",
  301. style: TextStyle(
  302. fontSize: 0.97.wp,
  303. fontWeight: FontWeight.w400,
  304. color: Colors.black)),
  305. SizedBox(width: 0.5.wp),
  306. Text("时间 ${userInfo.iTime}",
  307. style: TextStyle(
  308. fontSize: 0.97.wp,
  309. fontWeight: FontWeight.w400,
  310. color: Colors.black)),
  311. SizedBox(width: 0.5.wp),
  312. Text("里程 ${userInfo.iMileage} km",
  313. style: TextStyle(
  314. fontSize: 0.97.wp,
  315. fontWeight: FontWeight.w400,
  316. color: Colors.black)),
  317. ],
  318. );
  319. }
  320. }