Flutter:Scaffold+TabBarView实现底部Tab页面框架

说明:

PageView实现多个子页面上下/左右滑动(类似ViewPager)
Scaffold+TabBarView(TabBarView封装了PageView)实现底部Tab页面框架

一、PageView实现多个子页面上下/左右滑动(类似ViewPager):

1.创建子页面:

class 子页面1 extends StatefulWidget { //有几个页就创建几个这种类
  const 子页面1({Key? key}) : super(key: key);
  @override
  自定义State类 createState() => 自定义State类();
}
//自定义State类
class 自定义State类 extends State<子页面1> {
  @override
  Widget build(BuildContext context) {
    return 布局类或容器类Widget(
      ... //省略具体页面布局
    );
  }
}

2.使用PageView加载子页面列表:

PageView(
  scrollDirection: Axis.vertical, //滑动方向,(默认)horizontal为水平方向 、vertical为垂直方向
  allowImplicitScrolling: true,   //只能缓存当前页的前1页与后1页
  children: <Widget>[ //子页面列表
     子页面1(),
     子页面2(),
     ...
  ]
)

二、Scaffold+TabBarView实现底部Tab页面框架:

1.实现Tab框架主页:

(1)Tab框架主页类:

class MainTabPage extends StatefulWidget {  //Tab框架主页
  const MainTabPage({super.key});
  @override
  State<MainTabPage> createState() => _MainTabState();
}

(2)Tab框架主页State类:

class _MainTabState extends State<MainTabPage> with SingleTickerProviderStateMixin {  //Tab框架主页State类
  List<String> titleTexts = ["首页", "记录", "我的"];
  List<String> tabTexts = ["首页", "记录", "我的"];
  int tabIndex = 0; //记录当前选中页索引
  late TabController pageController; //页面切换监听
  @override
  void initState() {//初始化
    super.initState();
    pageController = TabController(length: tabTexts.length, vsync: this);
    pageController.addListener(() { //监听页面切换回调
      setState(() {
        this.tabIndex = pageController.index;
      });
    });
  }
  @override
  Widget build(BuildContext context) {
    return Scaffold( //骨架类Widget
      appBar: AppBar(centerTitle: true, title: Text(titleTexts[tabIndex])),
      bottomNavigationBar: BottomNavigationBar( //底部Tab导航
        items: <BottomNavigationBarItem>[
          BottomNavigationBarItem(icon: Icon(Icons.home), label: tabTexts[0]),
          BottomNavigationBarItem(icon: Icon(Icons.business), label: tabTexts[1]),
          BottomNavigationBarItem(icon: Icon(Icons.school), label: tabTexts[2]),
        ],
        currentIndex: tabIndex, //当前选中的tab索引
        fixedColor: Colors.blue,
        onTap: onTabItemClick,
      ),
      body: TabBarView(   //TabBarView可以替换成PageView
        controller: pageController,  //监听页面切换回调
        children: <Widget>[ //子页面列表
          Page1(),
          Page2(),
          Page3()
        ],
      ),
    );
  }
  void onTabItemClick(int index) { //Tab点击时切换页面
    setState(() {
      this.tabIndex = index;
      pageController.index = index; //切换页面
    });
  }
  @override
  void dispose() {
    pageController.dispose();   // 释放资源
    super.dispose();
  }
}

2.实现各子页面(创建多个子页面类+子页面State类):

(1)子页面类:

class Page1 extends StatefulWidget {
  const Page1({Key? key}) : super(key: key);
  @override
  _Page1State createState() => _Page1State();
}

(2)子页面State类:

class _Page1State extends State<Page1> with AutomaticKeepAliveClientMixin {
  @override
  Widget build(BuildContext context) {
    super.build(context); // 必须调用
    return ...;   //省略页面具体布局
  }
  @override
  bool get wantKeepAlive => true; // true缓存页面,false不缓存
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在指定的TabBarView页面中显示FloatingActionButton,可以将FloatingActionButton放置在Scaffold组件的bottomNavigationBar属性中,在TabBarView组件的子页面中,可以通过Scaffold.of(context)来获取父级Scaffold组件,然后使用ScaffoldState.showSnackBar或者ScaffoldState.showBottomSheet方法来显示SnackBar或BottomSheet。 以下是示例代码: ```dart class MyHomePage extends StatefulWidget { @override _MyHomePageState createState() => _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> with SingleTickerProviderStateMixin { final List<Tab> tabs = [ Tab(text: "Tab 1"), Tab(text: "Tab 2"), Tab(text: "Tab 3"), ]; TabController _tabController; @override void initState() { super.initState(); _tabController = TabController(length: tabs.length, vsync: this); } @override void dispose() { _tabController.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("My App"), bottom: TabBar( controller: _tabController, tabs: tabs, ), ), bottomNavigationBar: FloatingActionButton( onPressed: () { Scaffold.of(context).showSnackBar(SnackBar( content: Text("Button Pressed"), )); }, child: Icon(Icons.add), ), body: TabBarView( controller: _tabController, children: <Widget>[ Center(child: Text("Tab 1")), Center(child: Text("Tab 2")), Center(child: Text("Tab 3")), ], ), ); } } ``` 在此示例中,我们将FloatingActionButton放置在Scaffold的bottomNavigationBar属性中,并在其onPressed回调中显示一个SnackBar。在TabBarView的子页面中,我们可以使用Scaffold.of(context)来获取父级Scaffold组件,并在需要时显示SnackBar或BottomSheet。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值