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小郭3 小时前
Genkit Dart 1.0 发布,Flutter 原生的 AI Agent 终于完整了
android·前端·flutter
第10086个小白3 小时前
flutter桌面端打包方式(Inno Setup Compiler)版本
前端·flutter
陆断枫19 小时前
Flutter 3.47 动画引擎盘点:Impeller 全平台,和那些"新特性"
flutter
程序员老刘20 小时前
Flet 1.0 思路很好,可惜来晚了
flutter·ai编程·客户端
m0_738185821 天前
Flutter 鸿蒙化实战:qr_code_scanner_plus 适配 OpenHarmony,二维码扫描
flutter·华为·harmonyos·鸿蒙
恋猫de小郭1 天前
Flutter + EmbeddingGemma 2,谷歌发布完全端侧的 AI Edge Foresight
android·前端·flutter
君赏2 天前
基于 FlutterPatch 快速接入 Flutter 热更新
flutter
律宏阔2 天前
Dart FFI 内存管理:用 using + Arena 替代嵌套 try-finally
前端·flutter
律宏阔2 天前
Flutter 调用 Go:从 c-shared + ffigen 到 @Native + Native Assets 踩坑记录
前端·flutter
律宏阔2 天前
Dart FFI 回调无法使用局部变量?使用 NativeCallable.isolateLocal
前端·flutter