美文网首页
Flutter 在body中设置TabBar和TabBarVie

Flutter 在body中设置TabBar和TabBarVie

作者: Superman168 | 来源:发表于2021-10-13 14:17 被阅读0次

前言

最近在开发中想实现一个AppBar下面有选项卡,来回切换的页面功能,百度了很多没有和自己需求符合的,网上大都是返回的Scaffold,使用系统的Appbar,添加至.bottom中,但是现在项目中用的是自定义的Appbar,不想破坏系统的统一封装。

解决方法

所以在body 中实现TabBar 和 TabBarView,开始使用Column一直不行,只能显示一个,但是在body里面同时放置 TabBar 和 TabBarView需要注意
TabBarView 的父 Widget 必须知道宽高才能布局,否则,会报错:BoxConstraints forces an infinite height.

使用 Column + Expanded 即可:

body: Column(
          children: <Widget>[
            //设置选项卡
            Material(
              //这里设置tab的背景色
              color: AppColor.white,
              child: buildTabBar(),
            ),
            Expanded(
              flex: 1,
                child:
                //设置选项卡对应的page
                buildBodyView())
          ],
        )

注:还有设置tabbar的tab背景颜色,tabbar中的tab的背景颜色取的实际是AppBar的主题色,所以我们将tabbar放在Material中来重置了主题色,变成我们想要的背景色.

buildTabBar为创建TabBar的方法:

buildTabBar() {
    //构造 TabBar
    Widget tabBar = TabBar(
        //tabs 的长度超出屏幕宽度后,TabBar,是否可滚动
        //设置为false tab 将平分宽度,为true tab 将会自适应宽度
        isScrollable: false,
        //设置tab文字得类型
        labelStyle: TextStyle(fontSize: 15, fontWeight: FontWeight.w500),
        //设置tab选中得颜色
        labelColor: Color(0xFF035DFF),
        //设置tab未选中得颜色
        unselectedLabelColor: AppColor.textLightDark,
        //设置自定义tab的指示器,CustomUnderlineTabIndicator
        //若不需要自定义,可直接通过
        //设置指示器颜色
        indicatorColor: Color(0xFF035DFF),
        //indicatorWight 设置指示器厚度
        indicatorPadding: EdgeInsets.only(left: 10, right: 10),
        indicatorWeight: 1.5,
        ///指示器大小计算方式,TabBarIndicatorSize.label跟文字等宽,TabBarIndicatorSize.tab跟每个tab等宽
        indicatorSize: TabBarIndicatorSize.label,
        //生成Tab菜单
        controller: tabController,
        //构造Tab集合
        tabs: tabs.map((e) => Tab(text: e)).toList());

    return tabBar;
  }

buildBodyView创建视图方法:

buildBodyView() {
    //构造 TabBarView
    Widget tabBarBodyView = TabBarView(
      controller: tabController,
      //创建Tab页
      children: tabs.map((e) {
        return Container(
          alignment: Alignment.center,
          child: Text(e, textScaleFactor: 1),
        );
      }).toList(),
    );
    return tabBarBodyView;
  }

相关文章

网友评论

      本文标题:Flutter 在body中设置TabBar和TabBarVie

      本文链接:https://www.haomeiwen.com/subject/qjosoltx.html