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. Python基础概要(一天快速入门)

    文章目录 一 编程与编程语言 二 编程语言分类 三 主流编程语言介绍 四 Python介绍 五 安装python解释器 六 第一个python程序 七 变量 八 用户与程序交互 九 基本数据类型 十 ...

  2. python - view() + UpsamplingBilinear2d()

    import torch from torch import nn # view函数的-1参数的作用在于基于另一参数,自动计算该维度的大小 # view的第一个参数:2 代表的是batch 后面的2, ...

  3. 【Unity3D】消融特效

    1 前言 ​ 选中物体消融特效中基于 Shader 实现了消融特效,本文将基于 Shader Graph 实现消融特效,两者原理一样,只是表达方式不同,另外,选中物体消融特效中通过 discard 丢 ...

  4. QT(6)-QStandardItemModel

    @ 目录 1 说明 2 函数 2.1 构造函数 2.2 追加列\行 2.3 清除.删除并返回指定行或列 2.4 查找 2.5 设置水平\垂直表头项目 2.6 获得模型索引 2.7 插入 2.8 根项目 ...

  5. JVM指令分析

    代码: 1 public class AppGo{ 2 public static void test() { 3 boolean flag = true; 4 if (flag) System.ou ...

  6. 理解maven命令package、install、deploy的联系与区别(转)

    https://blog.csdn.net/zhaojianting/article/details/80324533 我们在用maven构建java项目时,最常用的打包命令有mvn package. ...

  7. 基于iptables防火墙堵漏

    之前在网上流传个段子:发现自己电脑被入侵,最有效的办法是即拔掉网线~ 虽然只是个段子却说明一旦机器发现漏洞被入侵,阻断入侵刻不容缓,无论对个人电脑和业务服务器都是如此. 商业服务器虽然有各种防护措施, ...

  8. GPTs 初体验 - 1 分钟就能创建一个自己的 ChatGPT?

    就在 11.10 号早上,ChatGPT 已经偷摸的把GPTs功能,开放给所有尊贵的 Plus 用户了. 随着这波的功能开放,界面也是改了不少.点击左侧的 Explore 或者左下角的用户处,就可以直 ...

  9. 【Javaweb】Servlet五 | HTTP协议【详解】

    什么是HTTP协议 什么是协议? 协议是指双方或多方相互约定好,大家都需要遵守的规则,叫协议. 所谓HTTP协议,就是指,客户端和服务器之间通信时,发送的数据,需要遵守的规则,叫做HTTP协议. HT ...

  10. IDEA编译器的永久试用设置与基本使用

    参考视频: 最通俗易懂的JDK.IDEA的安装使用权威指南 2023新版前端Web开发HTML5+CSS3+移动web视频教程,前端web入门首选黑马程序员 一.安装包下载与安装 官网下载地址 个人使 ...