flutter入门系列教程<三>:tabbar的高度自适用,支持无限滚动

news/2025/1/30 22:01:12/

背景

在之前的文章中,简介了tabbar组件的使用,它通常用于顶部放置tabbar标签页头,内容全部都是TabbarView的全部内容,且内容通常是占满屏幕的(尽可能大),如下:
在这里插入图片描述

但是有时候我们需要在文章的中间部分使用tabbar,之前也简介了封装的方法,当时的思路是给tabbarView限制高度、或者使用expand组件包裹,但这样也不是很灵活。

因为,如果tabbarView下面还有其他组件,那么tabbarView的高度就被限制死了。

那么,能否实现tabbarView无论在哪里,上面下面是否有组件时,其高度都能自适用呢?

自定义tabbar

由于tabbarView组件的特性使然,它必须有固定的高度、或者声明为占据尽可能大的高度,所以如果要让tabbar高度自适用,那就得自己封装,即:不使用tabbarView组件,效果图如下:
请添加图片描述

自定义tabbar源码

以下仅为示例代码,但足可以应付开发中的大部分需求,仅供参考:

import 'package:flutter/material.dart';class CustomTabBarExample extends StatefulWidget {const CustomTabBarExample({super.key});State<CustomTabBarExample> createState() => _CustomTabBarExampleState();
}class _CustomTabBarExampleState extends State<CustomTabBarExample> {int _selectedTabIndex = 0;Widget build(BuildContext context) {return DefaultTabController(length: 3, // Tab 的数量child: Scaffold(appBar: AppBar(title: const Text('自适用的tabbar'),),body: SingleChildScrollView(child: Column(children: [// 顶部部分,可自定义内容Container(height: 100,color: Colors.blue,child: const Center(child: Text('Top Section'),),),// TabBarTabBar(onTap: (index) {setState(() {_selectedTabIndex = index;});},tabs: const [Tab(text: 'Tab 1'),Tab(text: 'Tab 2'),Tab(text: 'Tab 3'),],),// 根据选中的 Tab 索引显示不同的内容_buildTabContent(_selectedTabIndex),// 底部部分,可自定义内容Container(height: 100,color: Colors.orange,child: const Center(child: Text('Bottom Section'),),),],),),),);}Widget _buildTabContent(int index) {switch (index) {case 0:return Container(height: 70,color: Colors.red,child: const Center(child: Text('Tab 1 Content'),),);case 1:return Container(height: 800,color: Colors.green,child: const Center(child: Text('Tab 2 Content'),),);case 2:return Container(height: 150,color: Colors.yellow,child: const Center(child: Text('Tab 3 Content'),),);default:return Container();}}
}

http://www.ppmy.cn/news/1567988.html

相关文章

如何在Windows系统上安装和配置Node.js及Node版本管理器(nvm)

Node.js是一个基于Chrome V8引擎的JavaScript运行时环境&#xff0c;广泛用于开发高性能的网络应用。它使得JavaScript不仅能在浏览器端运行&#xff0c;还能在服务器端执行。对于开发者来说&#xff0c;Node.js是现代Web应用的核心之一。安装和配置Node.js后&#xff0c;很多开…

P4681 [THUSC 2015] 平方运算 Solution

Description 给定序列 a ( a 1 , a 2 , ⋯ , a n ) a(a_1,a_2,\cdots,a_n) a(a1​,a2​,⋯,an​) 和常数 p p p &#xff0c;有 m m m 个操作&#xff0c;分以下两种&#xff1a; modify ⁡ ( l , r ) \operatorname{modify}(l,r) modify(l,r)&#xff1a;对每个 i ∈ [ …

26.useScript

在 Web 应用开发中&#xff0c;动态加载外部脚本是一个常见需求&#xff0c;特别是在需要集成第三方库或服务时。然而&#xff0c;在 React 应用中管理脚本加载可能会变得复杂。useScript 钩子提供了一种优雅的方式来处理外部脚本的加载、错误处理和清理&#xff0c;使得在 Rea…

web前端三大主流框架对比,Angular和React和Vue的区别

为什么说学会多种框架是很有好处的呢?其实从本质上来说&#xff0c;框架使编程变得更加有趣&#xff0c;并且框架使初学者更容易出成果&#xff0c;软件架构有就显得极为重要&#xff0c;那么你知道web前端三大主流框架对比&#xff0c;Angular和React和Vue之间有什么区别呢?…

MATLAB中alphanumericsPattern函数用法

目录 语法 说明 示例 从文本中提取字母和数字 匹配所设置数目的字母和数字 匹配不同大小的字母和数字集合 alphanumericsPattern函数的功能是匹配字母和数字字符。 语法 pat alphanumericsPattern pat alphanumericsPattern(N) pat alphanumericsPattern(minCharact…

OpenCV 版本不兼容导致的问题

问题和解决方案 今天运行如下代码&#xff0c;发生了意外的错误&#xff0c;代码如下&#xff0c;其中输入的 frame 来自于 OpenCV 开启数据流的读取 """ cap cv2.VideoCapture(RTSP_URL) print("链接视频流完成") while True:ret, frame cap.rea…

团体程序设计天梯赛-练习集——L1-022 奇偶分家

前言 这几道题都偏简单一点&#xff0c;没有什么计算&#xff0c;10分 L1-022 奇偶分家 给定N个正整数&#xff0c;请统计奇数和偶数各有多少个&#xff1f; 输入格式&#xff1a; 输入第一行给出一个正整N&#xff08;≤1000&#xff09;&#xff1b;第2行给出N个非负整数…

10.3 LangChain实战指南:解锁大模型应用的10大核心场景与架构设计

LangChain实战指南:解锁大模型应用的10大核心场景与架构设计 关键词: LangChain使用场景、LLM应用案例、检索增强生成、智能体开发、知识库问答 一、LangChain场景全景图:从简单到复杂的应用分层 #mermaid-svg-nzjpyXIPLzL0j3PG {font-family:"trebuchet ms",ver…