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,
          ),
        ),
      ],
    );
  }
相关推荐
恋猫de小郭17 小时前
最近 Android 有什么更新:Android Dev Summit 2026 技术解读
android·前端·flutter
好的佩奇1 天前
Dart 之类修饰符
android·flutter·dart
好的佩奇012 天前
Dart 之类修饰符
android·flutter·dart
Jewel1052 天前
文字为什么总是不居中!记录一个bug
android·flutter·ios
2601_949847752 天前
Form-data 跨端三方库仓颉适配全流程
前端·javascript·flutter
大龄秃头程序员3 天前
Flutter 中我为什么把 GetX 定位为高效率方案,而不是默认架构方案
flutter
传奇开心果编程3 天前
组合优先开发范式:从汉字造字原理到声明式UI组件组合思想
android·flutter·ios·swiftui·移动开发·harmonyos·android jetpack
2501_944521593 天前
Ramda 跨端三方库仓颉适配全流程
开发语言·javascript·flutter·php
大龄秃头程序员3 天前
Flutter 架构里总被混淆的 IoC、DI、Service Locator,到底是什么关系?
flutter
事圆则缓4 天前
Flutter 与原生交互的最后一层:RTC 视频帧怎么走
flutter·音视频·实时音视频