setting_view.dart 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701
  1. import 'dart:io';
  2. import 'package:flutter/cupertino.dart';
  3. import 'package:flutter/material.dart';
  4. import 'package:flutter/services.dart';
  5. import 'package:flutter_screenutil/flutter_screenutil.dart';
  6. import 'package:flutter_svg/flutter_svg.dart';
  7. import 'package:get/get.dart';
  8. import 'package:nomo/app/base/base_view.dart';
  9. import 'package:nomo/app/constants/assets.dart';
  10. import 'package:nomo/app/dialog/all_dialog.dart';
  11. import 'package:nomo/app/widgets/click_opacity.dart';
  12. import 'package:nomo/app/widgets/ix_image.dart';
  13. import 'package:nomo/config/theme/theme_extensions/theme_extension.dart';
  14. import 'package:nomo/utils/device_manager.dart';
  15. import '../../../../config/theme/dark_theme_colors.dart';
  16. import '../../../../config/translations/localization_service.dart';
  17. import '../../../../config/translations/strings_enum.dart';
  18. import '../../../../utils/system_helper.dart';
  19. import '../../../components/ix_snackbar.dart';
  20. import '../../../constants/iconfont/iconfont.dart';
  21. import '../../../routes/app_pages.dart';
  22. import '../../../widgets/ix_app_bar.dart';
  23. import '../controllers/setting_controller.dart';
  24. class SettingView extends BaseView<SettingController> {
  25. const SettingView({super.key});
  26. @override
  27. PreferredSizeWidget? get appBar => IXAppBar(title: Strings.settings.tr);
  28. @override
  29. Widget buildContent(BuildContext context) {
  30. return CustomScrollView(
  31. slivers: [
  32. // Account Section
  33. _buildSectionHeader(Strings.account.tr),
  34. _buildLoginSection(),
  35. _buildAccountSection(),
  36. // Network Section
  37. _buildSectionHeader(Strings.networkSection.tr),
  38. _buildNetworkSection(),
  39. // APP Section
  40. _buildSectionHeader('APP'),
  41. _buildAppSection(),
  42. // Security Section
  43. // _buildSectionHeader(Strings.securitySection.tr),
  44. // _buildSecuritySection(),
  45. // 底部间距
  46. SliverSafeArea(sliver: SliverToBoxAdapter(child: 0.verticalSpace)),
  47. ],
  48. );
  49. }
  50. /// 构建分组标题
  51. Widget _buildSectionHeader(String title) {
  52. return SliverToBoxAdapter(
  53. child: Padding(
  54. padding: EdgeInsets.fromLTRB(14.w, 10.w, 14.w, 10.w),
  55. child: Text(
  56. title,
  57. style: TextStyle(
  58. fontSize: 16.sp,
  59. color: Get.reactiveTheme.hintColor,
  60. fontWeight: FontWeight.w500,
  61. ),
  62. ),
  63. ),
  64. );
  65. }
  66. /// 构建登录分组
  67. Widget _buildLoginSection() {
  68. return SliverToBoxAdapter(
  69. child: Obx(() {
  70. final isPremium = controller.isPremium;
  71. final isGuest = controller.isGuest;
  72. if (!isGuest) {
  73. return SizedBox.shrink();
  74. }
  75. return Container(
  76. margin: EdgeInsets.only(left: 14.w, right: 14.w, bottom: 10.w),
  77. decoration: BoxDecoration(
  78. color: Get.reactiveTheme.highlightColor,
  79. borderRadius: BorderRadius.circular(12.r),
  80. ),
  81. child: _buildSettingItem(
  82. icon: IconFont.icon37,
  83. iconColor: Get.reactiveTheme.shadowColor,
  84. title: Strings.login.tr,
  85. trailing: Row(
  86. children: [
  87. IXImage(
  88. source: isPremium ? Assets.premium : Assets.free,
  89. width: isPremium ? 92.w : 64.w,
  90. height: 28.w,
  91. sourceType: ImageSourceType.asset,
  92. ),
  93. 4.horizontalSpace,
  94. Icon(
  95. IconFont.icon02,
  96. size: 20.w,
  97. color: Get.reactiveTheme.hintColor,
  98. ),
  99. ],
  100. ),
  101. onTap: () {
  102. Get.toNamed(Routes.LOGIN);
  103. },
  104. ),
  105. );
  106. }),
  107. );
  108. }
  109. /// Account 分组
  110. Widget _buildAccountSection() {
  111. return SliverToBoxAdapter(
  112. child: Obx(() {
  113. final isPremium = controller.isPremium;
  114. final isGuest = controller.isGuest;
  115. return Container(
  116. margin: EdgeInsets.symmetric(horizontal: 14.w),
  117. decoration: BoxDecoration(
  118. color: Get.reactiveTheme.highlightColor,
  119. borderRadius: BorderRadius.circular(12.r),
  120. ),
  121. child: Column(
  122. children: [
  123. if (!isGuest)
  124. _buildSettingItem(
  125. icon: IconFont.icon29,
  126. iconColor: Get.reactiveTheme.shadowColor,
  127. title: Strings.account.tr,
  128. trailing: IXImage(
  129. source: isPremium ? Assets.premium : Assets.free,
  130. width: isPremium ? 92.w : 64.w,
  131. height: 28.w,
  132. sourceType: ImageSourceType.asset,
  133. ),
  134. onTap: () {
  135. Get.toNamed(Routes.ACCOUNT);
  136. },
  137. ),
  138. if (!isGuest) _buildDivider(),
  139. _buildSettingItem(
  140. icon: IconFont.icon14,
  141. iconColor: Get.reactiveTheme.shadowColor,
  142. title:
  143. 'UID ${DeviceManager.getCacheDeviceId().length > 12 ? '${DeviceManager.getCacheDeviceId().substring(0, 6)}***${DeviceManager.getCacheDeviceId().substring(DeviceManager.getCacheDeviceId().length - 6)}' : DeviceManager.getCacheDeviceId()}',
  144. showInfo: true,
  145. trailing: ClickOpacity(
  146. onTap: () {
  147. Clipboard.setData(
  148. ClipboardData(text: DeviceManager.getCacheDeviceId()),
  149. );
  150. IXSnackBar.showIXSnackBar(
  151. title: Strings.copied.tr,
  152. message: Strings.copied.tr,
  153. );
  154. },
  155. child: Icon(
  156. IconFont.icon57,
  157. size: 20.w,
  158. color: Get.reactiveTheme.hintColor,
  159. ),
  160. ),
  161. onTap: () {},
  162. onInfoTap: () {
  163. AllDialog.showUidInfo();
  164. },
  165. ),
  166. _buildDivider(),
  167. // 根据用户类型显示不同的时间信息
  168. if (isPremium) ...[
  169. // _buildSettingItem(
  170. // icon: IconFont.icon23,
  171. // iconColor: Get.reactiveTheme.shadowColor,
  172. // title: Strings.myPreCode.tr,
  173. // trailing: Row(
  174. // mainAxisSize: MainAxisSize.min,
  175. // children: [
  176. // Text(
  177. // '123***ADZ',
  178. // style: TextStyle(
  179. // fontSize: 13.sp,
  180. // color: Get.reactiveTheme.hintColor,
  181. // ),
  182. // ),
  183. // SizedBox(width: 4.w),
  184. // Icon(
  185. // IconFont.icon02,
  186. // size: 20.w,
  187. // color: Get.reactiveTheme.hintColor,
  188. // ),
  189. // ],
  190. // ),
  191. // onTap: () {
  192. // // TODO: 跳转到Pre Code页面
  193. // Get.toNamed(Routes.PRECODE);
  194. // },
  195. // ),
  196. // _buildDivider(),
  197. _buildSettingItem(
  198. icon: IconFont.icon30,
  199. iconColor: Get.reactiveTheme.shadowColor,
  200. title: Strings.validTerm.tr,
  201. trailing: Text(
  202. 'Year / 2026-12-12',
  203. style: TextStyle(
  204. fontSize: 13.sp,
  205. color: Get.reactiveTheme.primaryColor,
  206. fontWeight: FontWeight.w500,
  207. ),
  208. ),
  209. onTap: () {
  210. // TODO: 跳转到有效期详情页面
  211. },
  212. ),
  213. ] else ...[
  214. _buildSettingItem(
  215. icon: IconFont.icon30,
  216. iconColor: Get.reactiveTheme.shadowColor,
  217. title: Strings.freeTime.tr,
  218. trailing: Text(
  219. '01:60:59 / Days',
  220. style: TextStyle(
  221. fontSize: 14.sp,
  222. color: const Color(0xFFFFCC00),
  223. fontWeight: FontWeight.w500,
  224. ),
  225. ),
  226. ),
  227. ],
  228. // _buildDivider(),
  229. // _buildSettingItem(
  230. // icon: IconFont.icon31,
  231. // iconColor: Get.reactiveTheme.shadowColor,
  232. // title: Strings.deviceAuthorization.tr,
  233. // trailing: Row(
  234. // mainAxisSize: MainAxisSize.min,
  235. // children: [
  236. // Text(
  237. // isPremium ? '1/4' : '0/1',
  238. // style: TextStyle(
  239. // fontSize: 13.sp,
  240. // color: Get.reactiveTheme.hintColor,
  241. // ),
  242. // ),
  243. // SizedBox(width: 4.w),
  244. // Icon(
  245. // IconFont.icon02,
  246. // size: 20.w,
  247. // color: Get.reactiveTheme.hintColor,
  248. // ),
  249. // ],
  250. // ),
  251. // onTap: () {
  252. // Get.toNamed(Routes.DEVICEAUTH);
  253. // },
  254. // ),
  255. ],
  256. ),
  257. );
  258. }),
  259. );
  260. }
  261. /// Network 分组
  262. Widget _buildNetworkSection() {
  263. return SliverToBoxAdapter(
  264. child: Container(
  265. margin: EdgeInsets.symmetric(horizontal: 14.w),
  266. decoration: BoxDecoration(
  267. color: Get.reactiveTheme.highlightColor,
  268. borderRadius: BorderRadius.circular(12.r),
  269. ),
  270. child: Column(
  271. children: [
  272. _buildSettingItem(
  273. icon: IconFont.icon34,
  274. iconColor: Get.reactiveTheme.primaryColor,
  275. title: Strings.routingMode.tr,
  276. trailing: Icon(
  277. IconFont.icon02,
  278. size: 20.w,
  279. color: Get.reactiveTheme.hintColor,
  280. ),
  281. onTap: () {
  282. // TODO: 跳转到路由模式页面
  283. Get.toNamed(Routes.ROUTINGMODE);
  284. },
  285. ),
  286. _buildDivider(),
  287. if (Platform.isAndroid) ...[
  288. _buildSettingItem(
  289. icon: IconFont.icon32,
  290. iconColor: Get.reactiveTheme.primaryColor,
  291. title: Strings.splitTunneling.tr,
  292. trailing: Icon(
  293. IconFont.icon02,
  294. size: 20.w,
  295. color: Get.reactiveTheme.hintColor,
  296. ),
  297. onTap: () {
  298. // TODO: 跳转到分流隧道页面
  299. Get.toNamed(Routes.SPLITTUNNELING);
  300. },
  301. ),
  302. _buildDivider(),
  303. ],
  304. _buildSettingItem(
  305. icon: IconFont.icon33,
  306. iconColor: Get.reactiveTheme.primaryColor,
  307. title: Strings.autoReconnect.tr,
  308. trailing: Obx(
  309. () => CupertinoSwitch(
  310. value: controller.autoReconnect,
  311. onChanged: (value) {
  312. controller.autoReconnect = value;
  313. },
  314. activeTrackColor: Get.reactiveTheme.shadowColor,
  315. thumbColor: Colors.white,
  316. inactiveThumbColor: Colors.white,
  317. inactiveTrackColor: Colors.grey,
  318. ),
  319. ),
  320. ),
  321. _buildDivider(),
  322. _buildSettingItem(
  323. icon: IconFont.icon35,
  324. iconColor: Get.reactiveTheme.primaryColor,
  325. title: Strings.restoreDefault.tr,
  326. trailing: Icon(
  327. IconFont.icon02,
  328. size: 20.w,
  329. color: Get.reactiveTheme.hintColor,
  330. ),
  331. onTap: () {
  332. // TODO: 恢复默认设置
  333. },
  334. ),
  335. ],
  336. ),
  337. ),
  338. );
  339. }
  340. /// APP 分组
  341. Widget _buildAppSection() {
  342. return SliverToBoxAdapter(
  343. child: Container(
  344. margin: EdgeInsets.symmetric(horizontal: 14.w),
  345. decoration: BoxDecoration(
  346. color: Get.reactiveTheme.highlightColor,
  347. borderRadius: BorderRadius.circular(12.r),
  348. ),
  349. child: Column(
  350. children: [
  351. _buildSettingItem(
  352. icon: IconFont.icon36,
  353. iconColor: DarkThemeColors.settingAppLinearGradientStartColor,
  354. iconGradient: LinearGradient(
  355. colors: [
  356. DarkThemeColors.settingAppLinearGradientStartColor,
  357. DarkThemeColors.settingAppLinearGradientEndColor,
  358. ],
  359. begin: Alignment.topCenter,
  360. end: Alignment.bottomCenter,
  361. ),
  362. title: Strings.language.tr,
  363. trailing: Row(
  364. mainAxisSize: MainAxisSize.min,
  365. children: [
  366. Text(
  367. LocalizationService.getGlobalLanguageTitle(),
  368. style: TextStyle(
  369. fontSize: 13.sp,
  370. color: Get.reactiveTheme.hintColor,
  371. ),
  372. ),
  373. 8.horizontalSpace,
  374. Icon(
  375. IconFont.icon02,
  376. size: 20.w,
  377. color: Get.reactiveTheme.hintColor,
  378. ),
  379. ],
  380. ),
  381. onTap: () {
  382. // TODO: 跳转到语言选择页面
  383. Get.toNamed(Routes.LANGUAGE);
  384. },
  385. ),
  386. _buildDivider(),
  387. _buildSettingItem(
  388. icon: IconFont.icon37,
  389. iconColor: DarkThemeColors.settingAppLinearGradientStartColor,
  390. iconGradient: LinearGradient(
  391. colors: [
  392. DarkThemeColors.settingAppLinearGradientStartColor,
  393. DarkThemeColors.settingAppLinearGradientEndColor,
  394. ],
  395. begin: Alignment.topCenter,
  396. end: Alignment.bottomCenter,
  397. ),
  398. title: Strings.feedback.tr,
  399. trailing: Icon(
  400. IconFont.icon02,
  401. size: 20.w,
  402. color: Get.reactiveTheme.hintColor,
  403. ),
  404. onTap: () {
  405. // TODO: 跳转到反馈页面
  406. Get.toNamed(Routes.FEEDBACK);
  407. },
  408. ),
  409. _buildDivider(),
  410. _buildSettingItem(
  411. icon: IconFont.icon38,
  412. iconColor: DarkThemeColors.settingAppLinearGradientStartColor,
  413. iconGradient: LinearGradient(
  414. colors: [
  415. DarkThemeColors.settingAppLinearGradientStartColor,
  416. DarkThemeColors.settingAppLinearGradientEndColor,
  417. ],
  418. begin: Alignment.topCenter,
  419. end: Alignment.bottomCenter,
  420. ),
  421. title: Strings.privacyPolicy.tr,
  422. trailing: Icon(
  423. IconFont.icon02,
  424. size: 20.w,
  425. color: Get.reactiveTheme.hintColor,
  426. ),
  427. onTap: () {
  428. // TODO: 跳转到隐私政策页面
  429. SystemHelper.openPrivacyTerms();
  430. },
  431. ),
  432. _buildDivider(),
  433. _buildSettingItem(
  434. icon: IconFont.icon38,
  435. iconColor: DarkThemeColors.settingAppLinearGradientStartColor,
  436. iconGradient: LinearGradient(
  437. colors: [
  438. DarkThemeColors.settingAppLinearGradientStartColor,
  439. DarkThemeColors.settingAppLinearGradientEndColor,
  440. ],
  441. begin: Alignment.topCenter,
  442. end: Alignment.bottomCenter,
  443. ),
  444. title: Strings.termsOfService.tr,
  445. trailing: Icon(
  446. IconFont.icon02,
  447. size: 20.w,
  448. color: Get.reactiveTheme.hintColor,
  449. ),
  450. onTap: () {
  451. // TODO: 跳转到服务条款页面
  452. SystemHelper.openTermsOfService();
  453. },
  454. ),
  455. _buildDivider(),
  456. _buildSettingItem(
  457. svgPath: Assets.pushNotifications,
  458. iconColor: DarkThemeColors.settingAppLinearGradientStartColor,
  459. iconGradient: LinearGradient(
  460. colors: [
  461. DarkThemeColors.settingAppLinearGradientStartColor,
  462. DarkThemeColors.settingAppLinearGradientEndColor,
  463. ],
  464. begin: Alignment.topCenter,
  465. end: Alignment.bottomCenter,
  466. ),
  467. title: Strings.pushNotifications.tr,
  468. trailing: Obx(
  469. () => CupertinoSwitch(
  470. value: controller.pushNotifications,
  471. onChanged: (value) {
  472. controller.showNotificationConfigPage();
  473. },
  474. activeTrackColor: Get.reactiveTheme.shadowColor,
  475. thumbColor: Colors.white,
  476. inactiveThumbColor: Colors.white,
  477. inactiveTrackColor: Colors.grey,
  478. ),
  479. ),
  480. onTap: () {
  481. controller.showNotificationConfigPage();
  482. },
  483. ),
  484. _buildDivider(),
  485. _buildSettingItem(
  486. icon: IconFont.icon39,
  487. iconColor: DarkThemeColors.settingAppLinearGradientStartColor,
  488. iconGradient: LinearGradient(
  489. colors: [
  490. DarkThemeColors.settingAppLinearGradientStartColor,
  491. DarkThemeColors.settingAppLinearGradientEndColor,
  492. ],
  493. begin: Alignment.topCenter,
  494. end: Alignment.bottomCenter,
  495. ),
  496. title: Strings.version.tr,
  497. trailing: Text(
  498. 'V1.0.0',
  499. style: TextStyle(
  500. fontSize: 13.sp,
  501. color: Get.reactiveTheme.hintColor,
  502. ),
  503. ),
  504. ),
  505. ],
  506. ),
  507. ),
  508. );
  509. }
  510. /// Security 分组
  511. Widget _buildSecuritySection() {
  512. return SliverToBoxAdapter(
  513. child: Container(
  514. margin: EdgeInsets.symmetric(horizontal: 14.w),
  515. decoration: BoxDecoration(
  516. color: Get.reactiveTheme.highlightColor,
  517. borderRadius: BorderRadius.circular(12.r),
  518. ),
  519. child: Column(
  520. children: [
  521. _buildSettingItem(
  522. icon: IconFont.icon11,
  523. iconColor:
  524. DarkThemeColors.settingSecurityLinearGradientStartColor,
  525. iconGradient: LinearGradient(
  526. colors: [
  527. DarkThemeColors.settingSecurityLinearGradientStartColor,
  528. DarkThemeColors.settingSecurityLinearGradientEndColor,
  529. ],
  530. begin: Alignment.topCenter,
  531. end: Alignment.bottomCenter,
  532. ),
  533. title: Strings.changePassword.tr,
  534. onTap: () {
  535. // TODO: 跳转到忘记密码页面
  536. Get.toNamed(Routes.FORGOTPWD);
  537. },
  538. ),
  539. _buildDivider(),
  540. _buildSettingItem(
  541. icon: IconFont.icon40,
  542. iconColor:
  543. DarkThemeColors.settingSecurityLinearGradientStartColor,
  544. iconGradient: LinearGradient(
  545. colors: [
  546. DarkThemeColors.settingSecurityLinearGradientStartColor,
  547. DarkThemeColors.settingSecurityLinearGradientEndColor,
  548. ],
  549. begin: Alignment.topCenter,
  550. end: Alignment.bottomCenter,
  551. ),
  552. title: Strings.deleteAccount.tr,
  553. onTap: () {
  554. AllDialog.showDeleteAccountConfirm(() {
  555. // 退出登录
  556. controller.handleDeleteAccount();
  557. });
  558. },
  559. ),
  560. _buildDivider(),
  561. _buildSettingItem(
  562. icon: IconFont.icon66,
  563. iconColor:
  564. DarkThemeColors.settingSecurityLinearGradientStartColor,
  565. iconGradient: LinearGradient(
  566. colors: [
  567. DarkThemeColors.settingSecurityLinearGradientStartColor,
  568. DarkThemeColors.settingSecurityLinearGradientEndColor,
  569. ],
  570. begin: Alignment.topCenter,
  571. end: Alignment.bottomCenter,
  572. ),
  573. title: Strings.logout.tr,
  574. titleColor: const Color(0xFFEF0000),
  575. onTap: () {
  576. AllDialog.showLogoutConfirm(() {
  577. // 退出登录
  578. controller.handleLogout();
  579. });
  580. },
  581. ),
  582. ],
  583. ),
  584. ),
  585. );
  586. }
  587. /// 构建设置项
  588. Widget _buildSettingItem({
  589. IconData? icon,
  590. String? svgPath,
  591. required Color iconColor,
  592. Gradient? iconGradient,
  593. required String title,
  594. Color? titleColor,
  595. bool showInfo = false,
  596. Widget? trailing,
  597. VoidCallback? onTap,
  598. VoidCallback? onInfoTap,
  599. }) {
  600. // 确保至少提供了 icon 或 svgPath 之一
  601. assert(
  602. icon != null || svgPath != null,
  603. 'Must provide either icon or svgPath',
  604. );
  605. return ClickOpacity(
  606. onTap: onTap,
  607. child: Container(
  608. height: 56.w,
  609. padding: EdgeInsets.symmetric(horizontal: 14.w),
  610. child: Row(
  611. children: [
  612. // 图标
  613. Container(
  614. width: 30.w,
  615. height: 30.w,
  616. decoration: BoxDecoration(
  617. gradient: iconGradient,
  618. color: iconGradient == null ? iconColor : null,
  619. borderRadius: BorderRadius.circular(8.r),
  620. ),
  621. child: svgPath != null
  622. ? Padding(
  623. padding: EdgeInsets.all(5.w),
  624. child: SvgPicture.asset(
  625. svgPath,
  626. width: 20.w,
  627. height: 20.w,
  628. colorFilter: const ColorFilter.mode(
  629. Colors.white,
  630. BlendMode.srcIn,
  631. ),
  632. ),
  633. )
  634. : Icon(icon!, size: 20.w, color: Colors.white),
  635. ),
  636. 10.horizontalSpace,
  637. // 标题
  638. Expanded(
  639. child: Row(
  640. children: [
  641. Text(
  642. title,
  643. style: TextStyle(
  644. fontSize: 14.sp,
  645. color:
  646. titleColor ??
  647. Get.reactiveTheme.textTheme.bodyLarge!.color,
  648. fontWeight: FontWeight.w500,
  649. ),
  650. ),
  651. 4.horizontalSpace,
  652. if (showInfo)
  653. ClickOpacity(
  654. onTap: onInfoTap,
  655. child: Icon(
  656. IconFont.icon59,
  657. size: 20.w,
  658. color: Colors.white,
  659. ),
  660. ),
  661. ],
  662. ),
  663. ),
  664. // 右侧内容
  665. if (trailing != null) trailing,
  666. ],
  667. ),
  668. ),
  669. );
  670. }
  671. /// 构建分割线
  672. Widget _buildDivider() {
  673. return Padding(
  674. padding: EdgeInsets.only(left: 60.w),
  675. child: Divider(
  676. height: 1,
  677. color: Get.reactiveTheme.dividerColor.withOpacity(0.3),
  678. ),
  679. );
  680. }
  681. }