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. linux特殊权限rws和rwt

    Linux文件,除了rwx这些权限外,还有一些特殊的权限,如rws.rwt. 1.s权限(setuid) 1.1 设置方法:chmod u+s 该位可以让普通用户以root用户的角色运行只有root帐 ...

  2. 分享一个Redis自带的压测工具:redis-benchmark

    前言 今天给xdm分享一个Redis自带的压测工具:redis-benchmark. 介绍 redis-benchmark 是一个用于测试 Redis性能的基准测试工具,可以帮助开发人员评估和比较 R ...

  3. Typora +Picgo 搭建个人笔记

    目录 Typora +Picgo 搭建个人笔记 一.Picgo +Github 搭建图床 1.基础设置 2. 将配置导出,方便下次使用 二.Typora:设置 : 1. 基本设置 2. 导出自动提交 ...

  4. JVM-Java虚拟机是怎么实现synchronized的?

    1. JVM的锁优化 今天我介绍了 Java 虚拟机中 synchronized 关键字的实现,按照代价由高至低可分为重量级锁.轻量级锁和偏向锁三种. 重量级锁会阻塞.唤醒请求加锁的线程.它针对的是多 ...

  5. JAVA类的加载(2) ——按需加载(延迟加载)

    1.例1: 1 /* 2 按需加载:当你不去实例化Cat时,Cat相关类都不会被加载,即按需加载(需要时加载) 3 1.先加载父类 4 2.初始化类 5 3.类只加载一次(暂且这么认为)--缓存 6 ...

  6. Python标准库中隐藏的利器

    Python安装之后,其标准库中有的模块,不一定要通过代码来引用,还可以直接在命令行中使用的. 在命令行中直接使用Python标准库的模块,最大的好处就是就是不用写代码,就能使用其中的功能,当临时需要 ...

  7. C#操作Microsoft.Office.Interop.Word类库完整例子

    使用Microsoft.Office.Interop.Word类库操作wor文档 一.准备工作 首先在工厂中,引用[Microsoft.Office.Interop.Word],本地安装了world, ...

  8. 本地MinIO存储服务Java远程调用上传文件

    MinIO是一款高性能.分布式的对象存储系统,它可以100%的运行在标准硬件上,即X86等低成本机器也能够很好的运行MinIO.它的优点包括高性能.高可用性.易于部署和管理.支持多租户等. Cpola ...

  9. python列表添加元素之append()函数和insert()函数

    append()函数 在列表中添加新元素时,最简单的方法就是附加在末尾: list_1 = ['one', 'two', 'three'] print(list_1) list_1.append('f ...

  10. python之封装及私有方法

    目录 封装 简洁 私有方法 封装:提高程序的安全性 将属性和方法包装到类对象中,在方法内部对属性进行操作,在类对象外部调用方法,使得程序更加简洁 在python中,如果该属性不希望在类对象外部被访问, ...