import 'dart:async'; import 'package:flutter/cupertino.dart'; import 'package:get/get.dart'; import 'package:isekai_wiki/components/isekai_page_scaffold.dart'; import 'package:isekai_wiki/pages/discover.dart'; import 'package:isekai_wiki/pages/home.dart'; import 'package:isekai_wiki/pages/search.dart'; import 'package:isekai_wiki/pages/own_profile.dart'; class TabsPageController extends GetxController { final tabController = CupertinoTabController(); final streamController = StreamController.broadcast(); var tabIndex = 0.obs; void emit(String eventName) { streamController.add(eventName); } Future handleWillPop() async { if (Navigator.canPop(Get.context!)) { Get.back(); return false; } else if (tabController.index != 0) { tabController.index = 0; return false; } return true; } void handleTapTab(int tabIndex) { if (tabIndex != this.tabIndex.value) { this.tabIndex.value = tabIndex; return; } switch (tabIndex) { case 0: emit("tap:home"); break; } } void toSearchPage() { tabController.index = 2; } } class IsekaiWikiTabsPage extends StatelessWidget { const IsekaiWikiTabsPage({super.key}); @override Widget build(BuildContext context) { var c = Get.put(TabsPageController()); return WillPopScope( onWillPop: c.handleWillPop, child: CupertinoTabScaffold( backgroundColor: CupertinoTheme.of(context).scaffoldBackgroundColor, controller: c.tabController, resizeToAvoidBottomInset: false, tabBar: CupertinoTabBar( backgroundColor: CupertinoTheme.of(context).barBackgroundColor, height: 56, onTap: c.handleTapTab, items: const [ BottomNavigationBarItem( icon: Icon(CupertinoIcons.house), label: '首页', ), BottomNavigationBarItem( icon: Icon(CupertinoIcons.lightbulb), label: '发现', ), BottomNavigationBarItem( icon: Icon(CupertinoIcons.search), label: '搜索', ), BottomNavigationBarItem( icon: Icon(CupertinoIcons.person), label: '我的', ), ], ), tabBuilder: (context, index) { switch (index) { case 0: return CupertinoTabView( defaultTitle: "首页", builder: (context) => HomeTab( onSearchClick: c.toSearchPage, ), ); case 1: return CupertinoTabView( defaultTitle: "发现", builder: (context) => const DiscoverTab(), ); case 2: return CupertinoTabView( defaultTitle: "搜索", builder: (context) => const SearchTab(), ); case 3: return CupertinoTabView( defaultTitle: "我的", builder: (context) => const OwnProfileTab(), ); } return CupertinoTabView( defaultTitle: "页面不存在", builder: (context) => const IsekaiPageScaffold( child: SizedBox(), ), ); }, ), ); } }