main_tab_page.dart 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. import 'dart:async';
  2. import 'package:flutter/material.dart';
  3. import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
  4. import 'package:lszlgl/base/base_state.dart';
  5. import 'package:lszlgl/page/home/home_page.dart';
  6. import 'package:lszlgl/page/user_center/user_center_page.dart';
  7. /// 主页tab页面
  8. class MainTabPage extends StatefulWidget {
  9. const MainTabPage({Key? key}) : super(key: key);
  10. @override
  11. State<MainTabPage> createState() => _MainTabPageState();
  12. }
  13. class _MainTabPageState extends State<MainTabPage> {
  14. late List<String> tabTextList;
  15. late List<String> tabIconList;
  16. late List<String> tabIconSelectList;
  17. late List<Widget> pageList;
  18. late PageController ctrl;
  19. int selectedIndex = 0;
  20. DateTime? lastTime;
  21. ValueNotifier<bool> popState = ValueNotifier(false);
  22. void refreshTab(int index, {bool refreshPage = false}) {
  23. if (index == selectedIndex) return;
  24. setState(() {
  25. selectedIndex = index;
  26. });
  27. if (refreshPage) ctrl.jumpToPage(index);
  28. }
  29. @override
  30. void initState() {
  31. super.initState();
  32. tabTextList = ['首页', '用户中心'];
  33. tabIconList = [imgNavHome, imgNavUserCenter];
  34. tabIconSelectList = [imgNavHomeSelect, imgNavUserCenterSelect];
  35. pageList = [const HomePage(), const UserCenterPage()];
  36. ctrl = PageController(initialPage: selectedIndex);
  37. }
  38. @override
  39. Widget build(BuildContext context) {
  40. return Scaffold(
  41. backgroundColor: const Color(0xFFF3F3F3),
  42. body: buildPop(buildBody()),
  43. bottomNavigationBar: buildNavigation(),
  44. );
  45. }
  46. Widget buildPop(Widget child) {
  47. return ValueListenableBuilder<bool>(
  48. valueListenable: popState,
  49. builder: (_, value, __) {
  50. return PopScope(
  51. canPop: value,
  52. child: child,
  53. onPopInvoked: (didPop) {
  54. if (didPop) return;
  55. SmartDialog.showToast('再试一次退出');
  56. popState.value = true;
  57. // 2秒后不可退出
  58. Timer(
  59. const Duration(seconds: 2),
  60. () => popState.value = false,
  61. );
  62. },
  63. );
  64. },
  65. );
  66. }
  67. Widget buildBody() {
  68. return PageView.builder(
  69. controller: ctrl,
  70. // physics: const BouncingScrollPhysics(),
  71. onPageChanged: refreshTab,
  72. itemCount: pageList.length,
  73. itemBuilder: (_, index) => pageList[index],
  74. );
  75. }
  76. Widget buildNavigation() {
  77. return NavigationBar(
  78. selectedIndex: selectedIndex,
  79. surfaceTintColor: Colors.white,
  80. onDestinationSelected: (index) => refreshTab(index, refreshPage: true),
  81. destinations: List.generate(
  82. tabTextList.length,
  83. (index) => GestureDetector(
  84. behavior: HitTestBehavior.opaque,
  85. onTap: () => refreshTab(index, refreshPage: true),
  86. child: Column(
  87. mainAxisAlignment: MainAxisAlignment.spaceEvenly,
  88. children: [
  89. Image.asset(
  90. index == selectedIndex ? tabIconSelectList[index] : tabIconList[index],
  91. height: 23,
  92. ),
  93. Text(
  94. tabTextList[index],
  95. style: TextStyle(
  96. fontSize: 14,
  97. fontWeight: FontWeight.w500,
  98. color: index == selectedIndex ? const Color(0xFF333333) : const Color(0xFF888888),
  99. ),
  100. ),
  101. ],
  102. ),
  103. ),
  104. ).toList(),
  105. );
  106. }
  107. }