Tiếp tục với chuỗi các bài viết tìm hiểu Package AutoRouter. Hôm này mình sẽ tìm hiểu cách setup một BottomTabNavigation.
1. Chuẩn Bị
-
Xác định số Tab muốn hiển thị trên BottomTabNavigation
-
Demo này mình sẽ hiển thị 3 Tab : Post, User, Setting.
@RoutePage() class PostPage extends StatefulWidget { const PostPage({super.key}); @RoutePage() class SettingPage extends StatefulWidget { const SettingPage({super.key}); @RoutePage() class UserPage extends StatefulWidget { const UserPage({super.key});
-
Bây giờ, chúng ta cần tạo một Page để chứa 3 Tab trên. Page này cần chứa một đối tượng gọi là
AutoTabsRouter
bao gồm các tham số :-
routes : Tham số này xác định các tabs con của BottomTabNavigation, chúng ta cần truyền các route vào.
-
duration: Độ dài của animation khi thay đổi tab. Nếu bạn không muốn có hiệu ứng thì set nó là 0
-
transitionBuilder : tham số này dùng để custom animation khi thay đổi tab.
-
builder : Dùng để xây dựng layout của footer
import 'package:auto_route/auto_route.dart'; import 'package:auto_route_study/config/auto_route/app_router.dart'; import 'package:flutter/material.dart'; @RoutePage() class DashBoardPage extends StatefulWidget { const DashBoardPage({super.key}); @override State<DashBoardPage> createState() => _DashBoardPageState(); } class _DashBoardPageState extends State<DashBoardPage> { @override Widget build(BuildContext context) { return AutoTabsRouter( duration: const Duration(milliseconds: 0), routes: const [ UserRoute(), PostRoute(), SettingRoute(), ], transitionBuilder: (context, child, animation) => FadeTransition( alwaysIncludeSemantics: true, opacity: animation, // the passed child is technically our animated selected-tab page child: child, ), builder: _tabBuilder, ); } late TabsRouter tabsRouters; Widget _tabBuilder(BuildContext context, Widget child) { tabsRouters = AutoTabsRouter.of(context); return Scaffold( body: child, bottomNavigationBar: _buildBottomNavigationBar(tabsRouters), ); } _buildBottomNavigationBar(TabsRouter tabsRouters) { return BottomNavigationBar( currentIndex: tabsRouters.activeIndex, onTap: _onTapBottomNavigation, items: const [ //Xác định Text và Icon ở mỗi Tab. BottomNavigationBarItem(label: 'Users', icon: Icon(Icons.people)), BottomNavigationBarItem(label: 'Posts', icon: Icon(Icons.people)), BottomNavigationBarItem(label: 'Settings', icon: Icon(Icons.people)), ], ); } void _onTapBottomNavigation(int value) { //setActiveIndex dùng để chuyển tab tabsRouters.setActiveIndex(value); } }
-
-
Tiếp theo chúng ta cần khai báo các route ở AppRouter
import 'package:auto_route/auto_route.dart'; import 'package:auto_route_study/config/auto_route/path_router.dart'; import 'package:auto_route_study/presentation/dash_board_page.dart'; import 'package:auto_route_study/presentation/login_page.dart'; import 'package:auto_route_study/presentation/post_page.dart'; import 'package:auto_route_study/presentation/setting_page.dart'; import 'package:auto_route_study/presentation/user_page.dart'; part 'app_router.gr.dart'; @AutoRouterConfig() class AppRouter extends _$AppRouter { @override List<AutoRoute> get routes => [ AutoRoute( initial: true, path: PathRouter.dashboardPage, page: DashBoardRoute.page, children: [ AutoRoute( initial: true, path: PathRouter.userPage, page: UserRoute.page, ), AutoRoute( path: PathRouter.postPage, page: PostRoute.page, ), AutoRoute( path: PathRouter.settingPage, page: SettingRoute.page, ), ], ), AutoRoute(path: PathRouter.loginPage, page: LoginRoute.page) ]; }
-
Có thể thấy DashBoardRoute chứa các route con bao gồm : UserRoute, PostRoute, SettingRoute
-
UserRoute đang setting initial = true, nghĩa là Tab này sẽ được chọn khi BottomTabNavigation hiển thị.
-
-
Đến đây, mình đã hoàn thành các bước cài đặt BottomTabNavigation cơ bản nhất dùng AutoRoute rồi. Cùng chạy code lên thử nhé.
-
Tips : Để biết được BottomTabNavitaion đang hiển thị Tab nào chúng ta có thể dùng thuộc tính
activeIndex
tabsRouters = AutoTabsRouter.of(context); var indexSelected = tabsRouters.activeIndex;
-
Để di chuyển sang một Tab khác, có thể dùng hàm
setActiveIndex
tabsRouters = AutoTabsRouter.of(context); tabsRouters.setActiveIndex(value);
-
-
Đến đây, mình đã tìm hiểu cách tạo BottomNavigation cơ bản nhất sử dụng AutoRoute. Sẽ còn phần nâng cao nữa. nhưng để không bị ngợp. Ở phần này mình chỉ tìm hiểu đến đây.
-
Ngoài ra, đối tượng
AutoTabsRouter
còn sử dụng có thêm 2 contructor nữa làAutoTabsRouter.pageView
,AutoTabsRouter.tabBar
cách sử dụng giống như trên chỉ khác nhau về hành vi thể hiện.