Flutter 扩展hi_navigator支持底部tab导航通知

hi_navigator.dart

添加首页底部Tab切换监听

  // 首页底部tab
  RouteStatusInfo _bottomTab;
  
  // 首页底部 tab 切换监听
  void addBottomTabChange(int index, Widget page) {
    _bottomTab = RouteStatusInfo(RouteStatus.home, page);
    _notify(_bottomTab);
  }
  
  void _notify(RouteStatusInfo current) {
    if (current is BottomNavigator && _bottomTab != null) {
      // 如果打开的是首页,则明确到首页具体的tab
      current = _bottomTab;
    }
    
    _listeners.forEach((element) {
      element(current, _current);
    });
    
    _current = current;
  }

bottom_navigator.dart

封装 PageView 和 BottomNavigationBar 切换监听,动态设置 底部 tab 切换监听

static int initialPage = 0;
final PageController _controller = new PageController(initialPage: initialPage);

@override
  Widget build(BuildContext context) {
    _pages = [HomePage(), HomePage(), HomePage(), HomePage()];
    if (!_hasBuild) {
      // 页面第一次打开时通知打开的是哪个tab
      HiNavigator.getInstance()
          .addBottomTabChange(initialPage, _pages[initialPage]);
      _hasBuild = true;
    }
    return Scaffold(
      body: PageView(
        controller: _controller,
        children: _pages,
        onPageChanged: (index) => _onJumpTo(index, pageChange: true),
        physics: NeverScrollableScrollPhysics(), // 禁止 PageView 滑动
      ),
      bottomNavigationBar: BottomNavigationBar(
        currentIndex: _currentIndex,
        onTap: (index) => _onJumpTo(index),
        selectedItemColor: _activeColor,
        items: [
          _bottomItem('首页', Icons.home, 0),
          _bottomItem('排行', Icons.local_fire_department, 1),
          _bottomItem('收藏', Icons.favorite, 2),
          _bottomItem('我的', Icons.live_tv, 3),
        ],
        type: BottomNavigationBarType.fixed, // 设置未选中也能显示标题
      ),
    );
  }
  
  void _onJumpTo(int index, {pageChange = false}) {
    if (!pageChange) {
      // 让PageView展示对应tab
      _controller.jumpToPage(index);
    } else {
      HiNavigator.getInstance().addBottomTabChange(index, _pages[index]);
    }
    setState(() {
      _currentIndex = index;
    });
  }

home_page.dart

防止页面重新初始化

class _HomePageState extends State<HomePage> with AutomaticKeepAliveClientMixin {
      @override
 	 bool get wantKeepAlive => true;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值