From 9fdca9136dbbad3a0089fad49123ed28c6343046 Mon Sep 17 00:00:00 2001 From: userGyl Date: Fri, 23 Jan 2026 17:00:17 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=BC=E8=88=AA=E6=A0=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ln_jq_app/assets/images/ic_car@2x.png | Bin 0 -> 1318 bytes ln_jq_app/assets/images/ic_car_select@2x.png | Bin 0 -> 1519 bytes ln_jq_app/assets/images/ic_h2@2x.png | Bin 0 -> 914 bytes ln_jq_app/assets/images/ic_h2_select@2x.png | Bin 0 -> 1047 bytes ln_jq_app/assets/images/ic_mall@2x.png | Bin 0 -> 1404 bytes ln_jq_app/assets/images/ic_mall_select@2x.png | Bin 0 -> 1611 bytes ln_jq_app/assets/images/ic_map@2x.png | Bin 0 -> 1587 bytes ln_jq_app/assets/images/ic_map_select@2x.png | Bin 0 -> 1812 bytes ln_jq_app/assets/images/ic_user@2x.png | Bin 0 -> 1245 bytes ln_jq_app/assets/images/ic_user_select@2x.png | Bin 0 -> 1459 bytes .../lib/pages/c_page/base_widgets/view.dart | 94 ++++++++++-------- ln_jq_app/lib/pages/c_page/car_info/view.dart | 86 +++++++--------- ln_jq_app/lib/pages/c_page/mine/view.dart | 2 +- .../lib/pages/c_page/reservation/view.dart | 25 ++--- 14 files changed, 107 insertions(+), 100 deletions(-) create mode 100644 ln_jq_app/assets/images/ic_car@2x.png create mode 100644 ln_jq_app/assets/images/ic_car_select@2x.png create mode 100644 ln_jq_app/assets/images/ic_h2@2x.png create mode 100644 ln_jq_app/assets/images/ic_h2_select@2x.png create mode 100644 ln_jq_app/assets/images/ic_mall@2x.png create mode 100644 ln_jq_app/assets/images/ic_mall_select@2x.png create mode 100644 ln_jq_app/assets/images/ic_map@2x.png create mode 100644 ln_jq_app/assets/images/ic_map_select@2x.png create mode 100644 ln_jq_app/assets/images/ic_user@2x.png create mode 100644 ln_jq_app/assets/images/ic_user_select@2x.png diff --git a/ln_jq_app/assets/images/ic_car@2x.png b/ln_jq_app/assets/images/ic_car@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..986316bb20ba7735d8d550ad870b90a0ace1b2a2 GIT binary patch literal 1318 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 literal 0 HcmV?d00001 diff --git a/ln_jq_app/assets/images/ic_h2_select@2x.png b/ln_jq_app/assets/images/ic_h2_select@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..4b1a721207b584fab3ca135ca38d76ecb41033c1 GIT binary patch literal 1047 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 literal 0 HcmV?d00001 diff --git a/ln_jq_app/assets/images/ic_map@2x.png b/ln_jq_app/assets/images/ic_map@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..de99391908575e6116b39fc6c49cb9082dcffd31 GIT binary patch literal 1587 zcmV-32F&@1P)kMnZ;$KKNiL zBp4JVC>SUd7*rG}C@AQIpr8+e!u9t%>_N_*IWv3D%vFSYS^v9cf33a#`*Y2l`+E2I z-z0&%J%N)m;0%n7jm-udz;ECjxB-+4{5uY|fce(#8m(pkr{;nqIQ2L96g&?e0RMx3 zfHIeV?}KC1Jqcdoxie`*04Jt^EqHMpEC4$DHhM;uWe;Up_Ef;5l=^zz{B4)j^l147;CDj$GlnkV^5=b}zp9CZB zr|_7jQV6^jOn)DAK{1k3f%kz&W`6!VbA`GgV=r1Fi)h#AREi>i@rUW?NpPBx^Nif<>9qb-Jbt9Z=^enID4jqb;%RAT;zHz>CbA^YxIItZ+of-=m>3x(Xd5?@(zS7?30ajFcU&4i+}! zNTaix_TK?#axFGJ97r~kBm#Cphrgru0ArlOl#*X5koLwl%rGGIgsQAxSC~v77+j0? z;xQD~8Itva^OF98nx0Cl7z{PZ=F*4&9qYU#48nHfm^#J_-zQvlo>I<0Oq=sljoW5 zE2E>{+0w~7X-$9;)iL89ZI;~)-rCO4dg?ZcI5j*BtqEut$9yexQyZ9hD*0~g*Sk%W z`=aBC)B4QERzW%;5Ujd99AP8OtK?kBY=a3!}D;@$WkJv{pw&y zUG*+aljhPH0bPK^MKA)M0DkCoi7BiQ|QaeN0! z1Tf^rT!!{H0bxk|CPsIIGvto~Lj{uU1zXdB?+quhX1HQF&*N<=BVd3vjfOVp*Yp|q zD)}E7ex3IFk70x#X%~{`*E$_HQ1e%rt<*PgqbOZyI}>=SouPI9);7wr{F?NDlo9Yq z)R~dyW zjbu@9+Wq8`bgAgL{d+m;_-EMGR={p29&yaavk_7&6q{3tNgaqRb{K)_raxDGV12E7Sr*rGU4i#FOY z?tg})d&TcQE+=Q>9C@y9_melZGwRHG{O+Nx`;aR2Qc9q{Sy~Moa<6#F3BN$N$Nb{$ zPfhM6;oeF!Ozk^DfPVS{krQAkco5tVUIdPQzr4x6J4&F5gLQ2t3Dk|yM3>(J00960 lo}f+c00006Nkl4g9Q literal 0 HcmV?d00001 diff --git a/ln_jq_app/assets/images/ic_map_select@2x.png b/ln_jq_app/assets/images/ic_map_select@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..bd7a2ee9cbbc08deabd6492a2819ba7e65f065f8 GIT binary patch literal 1812 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 Hu0mjf>8wWo literal 0 HcmV?d00001 diff --git a/ln_jq_app/assets/images/ic_user_select@2x.png b/ln_jq_app/assets/images/ic_user_select@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..fcfc538acff8e17bafc9068be64e31cc8b3df8ec GIT binary patch literal 1459 zcmV;k1x)&hP)eB9LHB(a1;-F$RUA-Zooqi7F>u>p`n#FG=&6G$RRnD7_88R9E4qUB`Hjy#nnww zNTE3_ROrDR3O#6vC4qPd)S{3r5fVtDLOlpAvGvK;zd}wIsI2ZuegyG@gY%Z63ThC$<|3x+f zA_v*a<#PFPLqo$Nm;f08&V}9G-Mc*djXDF=b+{LaMIwOFO+rqjufr+{mLU8ENF$&h zKgPWUaG2`}>OP=NJJ+Etv;c@CA$S)iose4wJ!4~IUE|~9S#Tqt&lmAI?sf0%?4+nC zA?>uepUq}FxDI8Z1k_UD77UUQpK~0i3&QhUKhp|@LaC*trH6;#g0`lnrWx0D6O^qj zlmJp8%SgUP^aaR&0GSG9Pg5O4TtM(0Dke8KHw$=cvlajmEyRo>lNxEReaWk?K;12T z8f+n?muu@;uol3`orXYy8JJUQP!44IeEt_2+ywEBjg517E3+0rv^Rk4d;PP-4{F!g z*!Y&b4Xgz)^+^R}1~if?1_o^()fyeH`M}Ov0FmM#1_|Y}ih=P|+iG8dJD@=r0e{dw z##U%OdbEE9$o|ql8(0fq^h&jW@6>!?M;gAVM);rQZD1{cg*Qt;rO#QLZICtplE zjBQwbsTdg60@wyuh^D{^w$!VX16id~$VFX`cBr_bD&r>!s z&QGUE!7Eg*F#7#?YYQb{baeC)?x2+Q;5(gY9_95K6(tv+~D9~XC{+51nGpzh#Men9@4ma_My#HPN>(o4rQSQ zC^{mFq(V1k?M&JlM@g^y@p$}q1pTQpgeORwcD!coByB#YerStCfLJIM7||32Pl6lV z)52WEuYnTeCGw2pIIlx~o_mp4WCH4JAa@6(5z_^Zf+HZsPScObS=V*7_13G0_K^x; zcWEcrKV}USDc`~`)^HnN>A}FMEgMxWK#mqPH=q*Xl<-er-QOS z?tewN@%w{*{$*AI7#Ttym?!5;0&CzN*Hb`i;}~_{ zhsiylH}Nzgrqw6cfi18A0<|&fGmKy#(bn;oAlMC2;{{6HIoh0{{RN<1>U_Ce{*f7# zAa0pkAOVnfApaesuAE+he2P(>G7q=6CL(UqM>o)iO(#e5+r((wTg&?@kN`&M%cscq zK;HUmtWJwQR(LmbA!3=nJBaa3{h5h37C_FQqeG>QjtnBN(7BnTNg^Fv+Pp6 zro9>oAb`&9^)pObqh=bwv>uCpl}$lsDt)F-5Hn%Y)<^*7{g3EOAMqu~TjxA|cp9hM zSyE|^N(t850N&S(1kh>q%ZVKQ)VIg*74$=}X5k{Upd+_ukG=xPNA2@^Nv*cFw(1Ma zv%|0tnc;Z`Y?*%av!mite7^Y#U~%b45TjG$eg663%$^Xl`ePYu;yu3>z5*cLsZO@H zw||m<86Z{lmR1^7V|&H)6+q)xfo4E28x>zT_z$lJz5+a3{|6o(2-xpQIGBO`o`Jss00960o>+Mk00006Nkl%QW literal 0 HcmV?d00001 diff --git a/ln_jq_app/lib/pages/c_page/base_widgets/view.dart b/ln_jq_app/lib/pages/c_page/base_widgets/view.dart index 81d539a..55a3fcb 100644 --- a/ln_jq_app/lib/pages/c_page/base_widgets/view.dart +++ b/ln_jq_app/lib/pages/c_page/base_widgets/view.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; -import 'package:getx_scaffold/common/index.dart'; +import 'package:get/get.dart'; import 'package:getx_scaffold/getx_scaffold.dart'; +import 'package:ln_jq_app/common/login_util.dart'; import 'package:ln_jq_app/pages/c_page/car_info/view.dart'; import 'package:ln_jq_app/pages/c_page/map/view.dart'; import 'package:ln_jq_app/pages/c_page/mine/view.dart'; @@ -9,9 +10,10 @@ import 'package:ln_jq_app/pages/c_page/reservation/view.dart'; import 'index.dart'; class BaseWidgetsPage extends GetView { - BaseWidgetsPage({super.key}); + BaseWidgetsPage({super.key}); final PageController _pageController = PageController(); + // 主视图 Widget _buildView() { return PageView( @@ -20,54 +22,68 @@ class BaseWidgetsPage extends GetView { onPageChanged: (index) { jumpTabAndPage(index); }, - children: _buildPages(), // 页面的列表 + children: _buildPages(), ); } void jumpTabAndPage(int index) { - controller.pageIndex = index; // 更新页面索引 - controller.updateUi(); // 更新 UI + controller.pageIndex = index; + controller.updateUi(); _pageController.jumpToPage(controller.pageIndex); } - // 对应的页面 + List _buildPages() { - return [ - ReservationPage(), - MapPage(), - CarInfoPage(), - MinePage(), - ]; + return [ReservationPage(), MapPage(), CarInfoPage(), MinePage()]; } - //导航栏 + // 自定义导航栏 (悬浮胶囊样式) Widget _buildNavigationBar() { - return NavigationX( - currentIndex: controller.pageIndex, // 当前选中的tab索引 - onTap: (index) { - jumpTabAndPage(index); - }, // 切换tab事件 - items: [ - NavigationItemModel( - label: '加氢预约', - icon: AntdIcon.orderedlist, - selectedIcon: AntdIcon.calendar_fill, + return SafeArea( + child: Container( + height: 50.h, + margin: const EdgeInsets.fromLTRB(24, 0, 24, 10), // 悬浮边距 + decoration: BoxDecoration( + color: Color.fromRGBO(240, 244, 247, 1), // 浅灰色背景 + borderRadius: BorderRadius.circular(30), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.05), + blurRadius: 10, + offset: const Offset(0, 5), + ), + ], ), - NavigationItemModel( - label: '地图', - icon: AntdIcon.location, - selectedIcon: AntdIcon.location_fill, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + _buildNavItem(0, "ic_h2_select@2x", "ic_h2@2x"), + _buildNavItem(1, "ic_map_select@2x", "ic_map@2x"), + _buildNavItem(2, "ic_car_select@2x", "ic_car@2x"), + _buildNavItem(3, "ic_user_select@2x", "ic_user@2x"), + ], ), - NavigationItemModel( - label: '车辆信息', - icon: AntdIcon.car, - selectedIcon: AntdIcon.car_fill, + ), + ); + } + + // 构建单个导航项 + Widget _buildNavItem(int index, String icon, String selectedIcon) { + bool isSelected = controller.pageIndex == index; + return GestureDetector( + onTap: () => jumpTabAndPage(index), + behavior: HitTestBehavior.opaque, + child: AnimatedContainer( + duration: const Duration(milliseconds: 200), + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 8), + decoration: BoxDecoration( + color: isSelected ? const Color(0xFF006633) : Colors.transparent, // 选中时的深绿色背景 + borderRadius: BorderRadius.circular(20), ), - NavigationItemModel( - label: '我的', - icon: AntdIcon.user, - selectedIcon: AntdIcon.user, - ), - ], + child: SizedBox( + height: 24, + width: 24, + child: LoginUtil.getAssImg(isSelected ? selectedIcon : icon),), + ), ); } @@ -78,10 +94,10 @@ class BaseWidgetsPage extends GetView { id: 'baseWidgets', builder: (_) { return Scaffold( - extendBody: false, + extendBody: true, // 重要:让 body 延伸到导航栏后面 resizeToAvoidBottomInset: false, bottomNavigationBar: _buildNavigationBar(), - body: SafeArea(child: _buildView()), + body: _buildView(), // 移除 SafeArea 以获得更好的全屏沉浸感 ); }, ); diff --git a/ln_jq_app/lib/pages/c_page/car_info/view.dart b/ln_jq_app/lib/pages/c_page/car_info/view.dart index d0ca30f..ccc0bd6 100644 --- a/ln_jq_app/lib/pages/c_page/car_info/view.dart +++ b/ln_jq_app/lib/pages/c_page/car_info/view.dart @@ -26,7 +26,7 @@ class CarInfoPage extends GetView { children: [ _buildUserInfoCard(), Padding( - padding: EdgeInsets.only(left: 20.w,right: 20.w), + padding: EdgeInsets.only(left: 20.w, right: 20.w), child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ @@ -35,6 +35,7 @@ class CarInfoPage extends GetView { _buildCertificatesCard(context), const SizedBox(height: 12), _buildSafetyReminderCard(), + SizedBox(height: 95.h), ], ), ), @@ -60,7 +61,7 @@ class CarInfoPage extends GetView { child: Column( children: [ Padding( - padding: EdgeInsets.only(left: 20.w, right: 20.w, bottom: 16, top: 40), + padding: EdgeInsets.only(left: 20.w, right: 20.w, bottom: 16, top: 50), child: Row( children: [ Stack( @@ -344,7 +345,7 @@ class CarInfoPage extends GetView { ), const SizedBox(height: 9), SizedBox( - height: 343.h, // 给定一个高度,或者使用别的方式布局 + height: 333.h, // 给定一个高度,或者使用别的方式布局 child: TabBarView( children: [ _buildCertificateContent('行驶证', controller.drivingAttachments), @@ -362,66 +363,55 @@ class CarInfoPage extends GetView { /// 构建单个证件的展示内容 Widget _buildCertificateContent(String title, RxList attachments) { return Obx(() { - if (attachments.isEmpty) { - return const Center(child: Text('暂无相关证件信息')); - } return Card( elevation: 0, color: Colors.white, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)), child: Padding( - padding: const EdgeInsets.all(16.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - _buildCertDetailItem('所有人', '上海羚牛氢运物联网科技有限公司', isFull: true), - _buildCertDetailItem('车辆识别代号', controller.vin), - ], - ), - const SizedBox(height: 16), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - _buildCertDetailItem( - '有效期至', - '2028-08-14', - valueColor: const Color(0xFF52C41A), - ), - _buildCertDetailItem('使用性质', '货运'), - ], - ), - const SizedBox(height: 20), - // 附件预览部分 - Expanded( - child: ListView.builder( - scrollDirection: Axis.vertical, - itemCount: attachments.length, - physics: const NeverScrollableScrollPhysics(), - itemBuilder: (context, index) { - final url = attachments[index]; - return GestureDetector( + padding: EdgeInsets.all(16.0), + child: attachments.isEmpty + ? const Center(child: Text('暂无相关证件信息')) + : Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + _buildCertDetailItem('所有人', '上海羚牛氢运物联网科技有限公司', isFull: true), + _buildCertDetailItem('车辆识别代号', controller.vin), + ], + ), + const SizedBox(height: 16), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + _buildCertDetailItem( + '有效期至', + '2028-08-14', + valueColor: const Color(0xFF52C41A), + ), + _buildCertDetailItem('使用性质', '货运'), + ], + ), + const SizedBox(height: 16), + // 附件预览部分 + GestureDetector( onTap: () { - controller.openAttachment(url); + controller.navigateToCertificateViewer(title, attachments); }, child: Container( height: 184.h, decoration: BoxDecoration( borderRadius: BorderRadius.circular(16), border: Border.all(color: Color.fromRGBO(226, 232, 240, 1)), - color: Color.fromRGBO(248, 250, 252, 1) + color: Color.fromRGBO(248, 250, 252, 1), ), - child: Center(child: _buildAttachmentPreview(url)), + child: Center(child: _buildAttachmentPreview(attachments[0])), ), - ); - }, + ), + ], ), - ), - ], - ), ), ); }); diff --git a/ln_jq_app/lib/pages/c_page/mine/view.dart b/ln_jq_app/lib/pages/c_page/mine/view.dart index 35965c8..3e7ea1e 100644 --- a/ln_jq_app/lib/pages/c_page/mine/view.dart +++ b/ln_jq_app/lib/pages/c_page/mine/view.dart @@ -38,7 +38,7 @@ class MinePage extends GetView { _buildSafetyReminderCard(), SizedBox(height: 24.h), _buildLogoutButton(), - SizedBox(height: 24.h), + SizedBox(height: 95.h), ], ), ), diff --git a/ln_jq_app/lib/pages/c_page/reservation/view.dart b/ln_jq_app/lib/pages/c_page/reservation/view.dart index 53f6f8e..e6c8da7 100644 --- a/ln_jq_app/lib/pages/c_page/reservation/view.dart +++ b/ln_jq_app/lib/pages/c_page/reservation/view.dart @@ -37,6 +37,7 @@ class ReservationPage extends GetView { _buildReservationFormCard(context), const SizedBox(height: 5), _buildTipsCard(), + SizedBox(height: 95.h), ], ), ), @@ -474,7 +475,7 @@ class ReservationPage extends GetView { ), ), Obx( - () => DropdownButtonHideUnderline( + () => DropdownButtonHideUnderline( child: DropdownButton2( isExpanded: true, hint: const Text( @@ -485,15 +486,15 @@ class ReservationPage extends GetView { items: controller.stationOptions .map( (station) => DropdownMenuItem( - value: station.hydrogenId, // value 是站点的唯一ID - enabled: station.isSelect == 1, - child: _buildDropdownItem(station), // child 是自定义的 Widget - ), - ) + value: station.hydrogenId, // value 是站点的唯一ID + enabled: station.isSelect == 1, + child: _buildDropdownItem(station), // child 是自定义的 Widget + ), + ) .toList(), value: - // 当前的站点 处理默认 - controller.selectedStationId.value ?? + // 当前的站点 处理默认 + controller.selectedStationId.value ?? (controller.stationOptions.isNotEmpty ? controller.stationOptions.first.hydrogenId : null), @@ -506,15 +507,15 @@ class ReservationPage extends GetView { customButton: Obx(() { // 优先从已选中的 ID 查找 var selectedStation = controller.stationOptions.firstWhereOrNull( - (s) => s.hydrogenId == controller.selectedStationId.value, + (s) => s.hydrogenId == controller.selectedStationId.value, ); // 如果找不到已选中的(比如 ID 为空或列表里没有),并且列表不为空,则取第一个作为默认 final stationToShow = selectedStation ?? - (controller.stationOptions.isNotEmpty - ? controller.stationOptions.first - : null); + (controller.stationOptions.isNotEmpty + ? controller.stationOptions.first + : null); // 如果有要显示的站点,就构建按钮 if (stationToShow != null) {