AppBar自定义顶部按钮图标、颜色

class MyHomePage extends StatelessWidget {
const MyHomePage({super.key}); @override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
leading: IconButton(
//导航左侧图标
icon: const Icon(Icons.home_max),
onPressed: () {
print("左侧点击了左侧");
},
),
title: const Text("Flutter App"), //标题
centerTitle: true, // 设置标题居中
backgroundColor: Colors.yellow, //导航背景颜色
actions: [
//导航右侧图标 一个或多个
IconButton(
icon: const Icon(Icons.home),
onPressed: () {
print("右侧点击了右侧");
},
),
IconButton(
icon: const Icon(Icons.safety_check),
onPressed: () {
print("右侧点击了右侧");
},
),
],
),
backgroundColor: Colors.red, //主体背景颜色
drawer: const Drawer(
child: Text("左侧侧边栏"),
),
);
}
}

Flutter AppBar结合TabBar实现顶部Tab切换

TabBar常见属性:

Tabbar TabBarView实现类似头条顶部导航

class MyHomeApp extends StatefulWidget {
const MyHomeApp({super.key}); @override
State<MyHomeApp> createState() => _MyHomeAppState();
} class _MyHomeAppState extends State<MyHomeApp>
with SingleTickerProviderStateMixin {
late TabController _tabController; //生命周期函数:当组件初始化的时候就会触发
void initState() {
super.initState();
_tabController = TabController(length: 3, vsync: this);
_tabController.addListener(() {
if (_tabController.animation!.value == _tabController.index) {
print(_tabController.index); //获取点击或滑动页面的索引值
}
});
} @override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Colors.red, //导航背景颜色
bottom: TabBar( isScrollable:true, //是否可滚动
indicatorColor:Colors.yellow, //指示器颜色
indicatorWeight:5, //指示器高度
indicatorPadding:EdgeInsets.all(10), //底部指示器的Padding
indicator:BoxDecoration( //指示器decoration,例如边框等
color: Colors.blue,
borderRadius: BorderRadius.circular(10) //圆角
),
labelColor: Colors.black, //选中label颜色
unselectedLabelColor:Colors.yellow, //未选中label颜色
labelStyle: const TextStyle(
fontSize: 20
),//选中label的Style
unselectedLabelStyle:const TextStyle(
fontSize: 15
),//未选中label的Style
indicatorSize:TabBarIndicatorSize.label, //指示器大小计算方式,TabBarIndicatorSize.label跟文字等宽,TabBarIndicatorSize.tab跟每个tab等宽
controller: _tabController, //注意: 配置controller需要去掉TabBar上const
tabs: const [
Tab(
child: Text("关注"),
),
Tab(
child: Text("热门"),
),
Tab(
child: Text("视频"),
),
],
),
),
body: TabBarView(
controller: _tabController,
children: [
const Text("第一个关注"),
ListView(
children: const [
ListTile(
title: Text("第一个热门"),
),
ListTile(
title: Text("第二个热门"),
),
ListTile(
title: Text("第三个热门"),
),
],
),
const ListTile(title: Text("第一个视频")),
],
),
// backgroundColor: Colors.red, //主体背景颜色
);
}
}

BottomNavigationBar 的页面中使用Tabbar

class GrownPage extends StatefulWidget {
const GrownPage({super.key}); @override
State<GrownPage> createState() => _GrownPageState();
} class _GrownPageState extends State<GrownPage>
with SingleTickerProviderStateMixin {
late TabController _tabController;
//生命周期函数:当组件初始化的时候就会触发
void initState() {
super.initState();
_tabController = TabController(length: 3, vsync: this);
_tabController.addListener(() {
if (_tabController.animation!.value == _tabController.index) {
print(_tabController.index); //获取点击或滑动页面的索引值
}
});
} @override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: TabBar(
isScrollable: true, //是否可滚动
controller: _tabController, //注意: 配置controller需要去掉TabBar上const
tabs: const [
Tab(
child: Text("我的关注"),
),
Tab(
child: Text("热门"),
),
Tab(
child: Text("视频"),
),
],
),
centerTitle: true, //是否居中 backgroundColor: Color.fromARGB(255, 46, 233, 90), //导航背景颜色
),
body: TabBarView(
controller: _tabController,
children: [
const Text("第一个成人关注"),
ListView(
children: const [
ListTile(
title: Text("第一个成人热门"),
),
ListTile(
title: Text("第二个热门"),
),
ListTile(
title: Text("第三个成人热门"),
),
],
),
const ListTile(title: Text("第一个成人视频")),
],
),
// backgroundColor: Colors.red, //主体背景颜色
);
}
}

preferredSize组件

PreferredSize可以改变appBar的高度
Scaffold(
appBar: PreferredSize(
preferredSize: Size.fromHeight(50),
child: AppBar(
....
)
),
body: Test(),
)

自定义KeepAliveWrapper 缓存页面

AutomaticKeepAliveClientMixin 可以快速的实现页面缓存功能,但是通过混入的方式实现不是很优
雅, 所以我们有必要对AutomaticKeepAliveClientMixin 混入进行封装
import 'package:flutter/material.dart';

class KeepAliveWrapper extends StatefulWidget {
const KeepAliveWrapper(
{Key? key, @required this.child, this.keepAlive = true})
: super(key: key);
final Widget? child;
final bool keepAlive;
@override
State<KeepAliveWrapper> createState() => _KeepAliveWrapperState();
} class _KeepAliveWrapperState extends State<KeepAliveWrapper>
with AutomaticKeepAliveClientMixin {
@override
Widget build(BuildContext context) {
return widget.child!;
} @override
bool get wantKeepAlive => widget.keepAlive;
@override
void didUpdateWidget(covariant KeepAliveWrapper oldWidget) {
if (oldWidget.keepAlive != widget.keepAlive) {
// keepAlive 状态需要更新,实现在 AutomaticKeepAliveClientMixin 中
updateKeepAlive();
}
super.didUpdateWidget(oldWidget);
}
}

监听TabController改变事件

//方法一
//生命周期函数:当组件初始化的时候就会触发
void initState() {
super.initState();
_tabController = TabController(length: 8, vsync: this);
_tabController.addListener(() {
print(_tabController.index); //获取点击或滑动页面的索引值 (两次)
if (_tabController.animation!.value == _tabController.index) {
print(_tabController.index); ////获取点击或滑动页面的索引值(一次)
}
});
} //方法二
controller: _tabController, //注意: 配置controller需要去掉TabBar上const
onTap: (index){ //只能监听点击事件;没法点击滑动
print("点击事件————————————————————:$index");
},

...

23、Flutter AppBar TabBar TabBarView的更多相关文章

  1. AppBar 自定义顶部导航按钮 图标、颜色 以及 TabBar 定义顶部 Tab 切换

    一.Flutter AppBar 自定义顶部按钮图标.颜色 leading   在标题前面显示的一个控件,在首页通常显示应用的 logo:在其他界面通常显示为返回按钮 title  标题,通常显示为当 ...

  2. Flutter AppBar 自定义顶部导航按钮 图标、颜色 以及 TabBar 定义顶部 Tab 切换

    Flutter AppBar 自定义顶部按钮图 标.颜色 属性 描述 leading 在标题前面显示的一个控件,在首页通常显示应用 的 logo;在其他界面通常显示为返回按钮 title 标题,通常显 ...

  3. 5、Flutter 实现 ViewPager、bottomNavigationBar 界面切换

    1.前言 首先我们想一下,如果在 Android 中实现 布局切换,通常的思路是: 做一个 viewpager 一组 Fragment 每个 Fragment 绑定一个 xml 最后填充至 viewp ...

  4. ABP(现代ASP.NET样板开发框架)系列之23、ABP展现层——异常处理

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之23.ABP展现层——异常处理 ABP是“ASP.NET Boilerplate Project (ASP.NET ...

  5. 【译】Java、Kotlin、RN、Flutter 开发出来的 App 大小,你了解过吗?

    现在开发 App 的方式非常多,原生.ReactNative.Flutter 都是不错的选择.那你有没有关注过,使用不同的方式,编译生成的 Apk ,大小是否会有什么影响呢?本文就以一个最简单的 He ...

  6. 移动端跨平台方案对比:React Native、weex、Flutter

    跨平台一直是老生常谈的话题,cordova.ionic.react-native.weex.kotlin-native.flutter等跨平台框架百花齐放,颇有一股推倒原生开发者的势头. 为什么我们需 ...

  7. 最火移动端跨平台方案盘点:React Native、weex、Flutter

    1.前言 跨平台一直是老生常谈的话题,cordova.ionic.react-native.weex.kotlin-native.flutter等跨平台框架的百花齐放,颇有一股推倒原生开发者的势头. ...

  8. 23、自动装配-Aware注入Spring底层组件&原理

    23.自动装配-Aware注入Spring底层组件&原理 Aware 接口,提供了类似回调函数的功能 自定义组件想要使用Spring 容器底层的一些组件(Application Context ...

  9. 热门跨平台方案对比:WEEX、React Native、Flutter和PWA

    本文主要对WEEX.React Native.Flutter和PWA几大热门跨平台方案进行简单的介绍和对比.内容选自<WEEX跨平台开发实战> (WEEX项目负责人力荐,从入门到实战,教你 ...

  10. Flutter 原生TabBar切换标签页示例

    效果图: 代码如下: import 'package:flutter/material.dart'; class TabsTestPage extends StatefulWidget { _Tabs ...

随机推荐

  1. Go语言常用标准库——json、文件操作、template、依赖管理及Go_module使用

    文章目录 Go语言之json Marshal函数 Unmarshal函数 Go语言之文件操作 打开和关闭文件 读取文件 file.Read() 基本使用 循环读取 bufio读取文件 ioutil读取 ...

  2. nvm的安装及使用(入门级)

    1 从官网下载压缩包到本地 下载地址: https://github.com/coreybutler/nvm-windows/releases 2 配置 2.1 settings.txt配置 (1)下 ...

  3. CF1526C2

    与简单版的思路完全一致,只需要改一下范围. 可以去看我简单版本的博客. 题目简化和分析: 给您一个数组,在其中选择若干个数使得: 任意前缀和 \(\ge 0\) 数量尽可能的大 我们可以使用贪心策略, ...

  4. 谈谈selenium4.0中的相对定位

    相对定位历史 2021-10-13 发布的 selenium 4.0 开始引入,selenium 3.X是没有的 implement relative locator for find_element ...

  5. 使用gitbook快速搭建文档中心

    背景 在研发一个系统,主要给公司内部同事用,按理说,简单点的话,搞个使用文档就行了,但产品经理希望是做成一个文档中心,比如,你学习个新技术的时候,比如vue,一般有个在线的帮助文档,他的想法就是这种. ...

  6. OI 模板合集

    update on 2023.10: 这篇博客的原本意义是 方便直接复制 / 快速复习,但部分原有代码存在本质错误,完全没有起到这个作用,故重构. 由于折叠代码块在某些 markdown 编辑器中不支 ...

  7. 极速指南:在 SpringBoot 中快速集成腾讯云短信功能

    前言 今天分享一个SpringBoot集成腾讯云短信的功能,平常除了工作,很多xdm做自己的小项目都可能用到短信,但自己去看文档挺费劲的,我这边就帮你节省时间,直接把步骤给你列出来,照做就行. 实战 ...

  8. 浅析Redis大Key

    一.背景 在京东到家购物车系统中,用户基于门店能够对商品进行加车操作.用户与门店商品使用Redis的Hash类型存储,如下代码块所示.不知细心的你有没有发现,如果单门店加车商品过多,或者门店过多时,此 ...

  9. QAction常用接口总结

    目录 public (一)构造函数 (二)setShortcut (三)setStatusTip Signals (一)trigger() public (一)构造函数 1.QAction(const ...

  10. WebGL初接触

    有感于在不少jd中看到关于WebGL的内容,想起来之前在高程中还没看完的canvas,就匆匆把剩余的一点看完了,高程中的内容还是皮毛,就属于很基础的.概念性的东西. WebGL 画布的3D上下文.不是 ...