flutter页面滚动TabBar+TabBarView

需求:实现页面和标签栏的点击跳转以及左右滑动跳转功能

注意点

必须保证TabBar、TabBarView、TabController传入的length为相同值且>=0

TabBar+TabBarView

  • 联合DefaultTabController

    less 复制代码
    DefaultTabController(
     length:lists.length,
     child:Scaffold(/// 根据UI规范写法,Column更自由
       appBar:AppBar(
         title:'xxx',
         bottom:TarBar(
           tabs:lists.map(item=>item.name).toList,
    
         )
       ),
       home:TarBarView()
     )
    )
  • 自定义Controller

less 复制代码
  TabController? _tabController;
  
    void _initTabController(int length) {
    _tabController?.removeListener(_handleTabChanged);
    _tabController?.dispose();

    if (length == 0) {
      _tabController = null;
      return;
    }

    _tabController = TabController(
      length: length,
      vsync: this,
      initialIndex: _safeIndex,
    );

    _tabController!.addListener(_handleTabChanged);
    }
  
  @override
  void initState() {
    super.initState();
    _initTabController(widget.tabs.length);
  }
  
    @override
  void dispose() {
    _tabController?.removeListener(_handleTabChanged);
    _tabController?.dispose();
    super.dispose();
  }
  
  @override 
  void buildContent(){
      return Column(
      mainAxisSize: MainAxisSize.max,
      children: [
        Container(
          color: backgroundColor,
          child: TabBar(
            controller: _tabController, 
            onTap: (index) {
              if (widget.selectedIndex != index) {
                widget.onTabChanged(index);
              }
            },
            isScrollable: true,
            tabAlignment: TabAlignment.start,
            tabs: widget.tabs.map((e) => Tab(text: e)).toList(),
            dividerColor: Colors.white.withValues(alpha: 0.1),
            indicatorSize: TabBarIndicatorSize.label,
            indicatorPadding: const EdgeInsets.symmetric(horizontal: 16),
            indicator: BoxDecoration(
              borderRadius: BorderRadius.circular(1.5),
              border: Border(
                bottom: BorderSide(
                  color: widget.selectedLabelColor ?? Colors.white,
                  width: 2.w,
                ),
              ),
            ),
            labelColor: widget.selectedLabelColor ?? Colors.white,
            unselectedLabelColor:
                widget.unselectedLabelColor ?? Colors.white.withValues(alpha: 0.6),
            labelStyle: TextStyle(fontSize: 16.sp, fontWeight: FontWeight.bold),
            dividerHeight: 0.5,
          ),
        );
          },

        widget.center ?? const SizedBox.shrink(),

        Expanded(
          child: TabBarView(
            controller: _tabController,
            children: widget.children,
          ),
        ),
      ],
    );
  }
相关推荐
年小个大1 天前
受 go-zero 启发,我给 Flutter 写了一套 CLI 脚手架
android·flutter·架构
GitLqr2 天前
Flutter 居然能直接跑在 Apple Watch 上了?玩转 flutter-watchos
flutter·全栈·apple watch
你听得到112 天前
排查 App 问题:别只盯着报错,把前后发生的事情串起来
android·前端·flutter
CappuccinoRose2 天前
前端存储体系学习总结文档
前端·客户端·cookie·ssr·服务端·localstorage·sessionstorage
天空之城--2 天前
近一周Android Flutter行业动态与实用参考
android·flutter
GitLqr2 天前
玩转 Flutter 项目依赖:从 pubspec.yaml 到实战包管理
flutter·面试·全栈
程序员老刘3 天前
Qwen 3.8 max干了20分钟没干完,免费模型3分17秒搞定,问题出在哪?
flutter·ai编程
飞凌嵌入式3 天前
告别多端重复开发:Buildroot+Flutter实现全平台UI风格统一
flutter·ui
FungLeo3 天前
Flutter 带 TTL 的多级缓存设计:内存+磁盘+网络三层实战
网络·flutter·缓存·性能优化
FungLeo3 天前
Flutter 可复用公共组件库设计与落地:AppDialog/BottomSheet 等实战
flutter