0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Flutter 组件集录: AppBar 的使用 | 开发者说·DTalk

谷歌开发者 来源:未知 2022-11-11 09:45 次阅读
cfa7c598-6161-11ed-8abf-dac502259ad0.jpg本文原作者: 张风捷特烈,原文发布于: 编程之王

前言

说起 AppBar 组件,大家都比较熟悉,默认情况下是一个 Material 风格的头部标题栏。可能有人疑惑,这么简单的东西,有什么好说的?其实该组件一些重要的属性很多人都不知道,另外在使用过程中有一些细节,本文将结合使用源码来详细探讨一下 AppBar 组件。

如下是 Material 2Material 3 风格下默认的 AppBar 展示效果:
Material 2 Material 3
cfe09788-6161-11ed-8abf-dac502259ad0.png cfec7206-6161-11ed-8abf-dac502259ad0.png
AppBar(title: const Text('AppBar 组件')),

AppBar 组件的高度

对于 AppBar 来说,最重要的莫过于它的高度,那它的高度是如何确定的呢?这就不得不说 PreferredSizeWidget 一族的组件了。如下可见,它实现了 PreferredSizeWidget 类:

d00e29c8-6161-11ed-8abf-dac502259ad0.png

如下所示,PreferredSizeWidget是一个抽象类,其中定义了 preferredSize 抽象 get 方法,返回 Size 对象。也就是说该族的组件是需要预先设定尺寸的:

abstract class PreferredSizeWidget implements Widget {
Size get preferredSize;
}

所以 AppBar 既然实现 PreferredSizeWidget,就必然实现 preferredSize 方法,返回尺寸。所以根据这个线索可以知道高度是如何确定的: AppBar 中定义了preferredSize 成员,所以抽象的 get 方法,将获取该成员:

AppBar 构造方法中,preferredSize 被赋值为 _PreferredAppBarSize 对象,其中有两个入参: toolbarHeight,和 bottom 的高度。

d0209694-6161-11ed-8abf-dac502259ad0.png如下是 _PreferredAppBarSize 类的定义,它继承自 Size,是一个专为 AppBar 高度派生的类。Size#fromHeight 构造中,宽度无限大,高度是 toolbarHeightbottomHeight 的和。其中 toolbarHeight 如果为空,会取 kToolbarHeight,值为 56:d04b26de-6161-11ed-8abf-dac502259ad0.png  
---->[AppBar]----
@override
final Size preferredSize;


---->[_PreferredAppBarSize]----
class _PreferredAppBarSize extends Size {
_PreferredAppBarSize(this.toolbarHeight, this.bottomHeight)
    : super.fromHeight((toolbarHeight ?? kToolbarHeight) + (bottomHeight ?? 0));
final double? toolbarHeight;
final double? bottomHeight;
}


---->[Size#fromHeight]----
const Size.fromHeight(double height) : super(double.infinity, height);
另外 AppBar 是可以指定 PreferredSizeWidget 类型的 bottom 组件,在标题的底部展示。如下所示,所以可以说,AppBar 组件的高度就是 toolbarHeightbottom 组件高度之和。d058e418-6161-11ed-8abf-dac502259ad0.png  
---->[AppBar]----
final PreferredSizeWidget? bottom;
final double? toolbarHeight;

另外,可以通过参数指定 toolbarHeight 的值,如下是 40 的效果,可以看出标题的高度变小,但并不会影响 bottom

d06900fa-6161-11ed-8abf-dac502259ad0.png  
AppBar(
title: const Text('AppBar 组件'),
toolbarHeight: 40,
),

关于 AppBar 的高度需要注意的就是这些,一般来说 AppBar 作为 Scaffold#appBar 属性的钦定组件使用,不会在外界单独使用。

AppBar 组件的部位

一个普通的 AppBar可以包含如下四个部位,leading 是左侧组件,title 是中间组件,actions 的右侧组件列表。bottom 是底部组件:

d074d1d2-6161-11ed-8abf-dac502259ad0.png  
---->[AppBar]----
final PreferredSizeWidget? bottom;
final Widget? leading;
final Widget? title;
final List? actions;

通过查看布局效果可以更清晰地看出 AppBar 各部位的占位情况,

d085f534-6161-11ed-8abf-dac502259ad0.png  

另外,还有一个 Widlget 类型的 flexibleSpace 属性,在源码实现的过程中,该组件将通过 Stack 叠放在 AppBar下方。效果如下,如果普通的 AppBar 底部用贴图的需求,可以使用这个属性:

d09bb7ac-6161-11ed-8abf-dac502259ad0.png  
---->[AppBar]----
final Widget? flexibleSpace;

部位相关控制属性

下面介绍一些关于部位的属性: centerTitle 是一个 bool 值,可以控制 title 是否居中显示。这个是在整体的居中,所以 AppBar 的标题栏并不是一个简单的 Row 组件包裹,具体地实现细节,将在源码分析中介绍:

d0ada0ca-6161-11ed-8abf-dac502259ad0.png
---->[AppBar]----
final bool? centerTitle;

toolbarOpacitybottomOpacity 分别用来控制标题栏和底栏的透明度,取值范围是 [0 ~ 1],默认是 1 不透明。一般来说很少有这种需求,了解一下即可:

d0bfb878-6161-11ed-8abf-dac502259ad0.png  
---->[AppBar]----
final double? toolbarOpacity;
final double? bottomOpacity;

titleSpacing 是一个 double 值,用于控制标题栏和区域左侧的间隔,默认情况下根据 Material 的风格有一定的空间,该值为 16:

d125143e-6161-11ed-8abf-dac502259ad0.png所以想要消除这个间距,让 titleSpacing 置零即可: d13208f6-6161-11ed-8abf-dac502259ad0.png  
final double? titleSpacing;
titleSpacing 是一个 double 值,用于控制左侧 leading 的区域宽度,默认情况下是 56,呈正方形:d13d009e-6161-11ed-8abf-dac502259ad0.png  
final double? leadingWidth;

AppBar 样式属性

可以通过 shape 属性设置 AppBar 形状,如下是通过 RoundedRectangleBorder 设置的圆角矩形。另外 elevationshadowColor 分别表示阴影的深度和阴影颜色:

d154bd2e-6161-11ed-8abf-dac502259ad0.png  
参数 类型 描述
shadowColor Color? 阴影颜色
elevation double 影深
shape ShapeBorder? 形状
d15f5c52-6161-11ed-8abf-dac502259ad0.png

另外通过去除阴影、设置背景色,也可以很轻松地摆脱 Material 风格。其中通过了 iconTheme 来配置 AppBar 中的默认图标主题,这样如果存在多个按钮,方便统一配置,避免一个个设置的麻烦。actionsIconTheme 的图标样式优先作用于 actions 属性中的组件。 另外,toolbarTextStyle 为工具条区域内的所有文字通过默认样式,titleTextStyle 配置的默认标题文字主题,优先级较高。

参数 类型 描述
backgroundColor Color? 背景色
iconTheme IconThemeData? 图标样式
actionsIconTheme IconThemeData? 右侧图标样式
titleTextStyle TextStyle? 标题文字样式
toolbarTextStyle TextStyle? 工具条文字样式
AppBar(
title: const Text('AppBar 组件'),
leading: BackButton(),
elevation: 0,
backgroundColor: Colors.white,
centerTitle: true,
iconTheme: IconThemeData(color: Colors.black),
titleTextStyle: TextStyle(color: Colors.black,fontSize: 16,fontWeight: FontWeight.bold),
actions: [
IconButton(onPressed: (){}, icon: Icon(Icons.refresh)),
IconButton(onPressed: (){}, icon: Icon(Icons.add)),
],
),

AppBar 的使用细节

AppBar 在构造时可以传入 automaticallyImplyLeading 属性,用于控制是否在 leadingnull 时,根据场景自动添加某些图标: 比如 Scaffloddrawer 属性非空时,会自动提供 leading,点击时响应事件打开 drawer

d16d8c28-6161-11ed-8abf-dac502259ad0.png

d18a5efc-6161-11ed-8abf-dac502259ad0.png

还有当跳转界面时,如果使用了 AppBar 并且未提供 leading,会自动添加返回按钮。如果不想启用这个功能,将 automaticallyImplyLeading 置为 false 即可。

AppBar的使用过程中,有一个非常重要,可能很少人注意的一点: AppBar 的背景色可以影响顶部状态栏的颜色。比如默认情况下背景色是蓝色,状态栏是白色:

d19a738c-6161-11ed-8abf-dac502259ad0.png

如果背景色是白色,状态栏就会是黑色,这样就很方便。

d1bba93a-6161-11ed-8abf-dac502259ad0.png

如果不使用 AppBar,也能界面跳着跳着状态栏就错乱了。比如类似下面的情况。通过源码可以知道 AppBar 中会通过 AnnotatedRegion 维护状态栏的颜色。

d1d3fe40-6161-11ed-8abf-dac502259ad0.png

如果状态栏的颜色和您预期的不同,可以通过 systemOverlayStyle 属性来设置状态栏的颜色,如下 light 会将状态栏图标的颜色变白:

systemOverlayStyle: const SystemUiOverlayStyle(
statusBarIconBrightness:Brightness.light
),

d19a738c-6161-11ed-8abf-dac502259ad0.png

关于 AppBar 的使用基本上就是这些,总的来看,AppBar 算是一个比较优秀的组件,使用很灵活,能满足绝大多数的头部栏使用场景。如果您在日常开发中还自己用 Row 来拼装,那不妨试试 AppBar 组件。


长按右侧二维码

查看更多开发者精彩分享

d20e117a-6161-11ed-8abf-dac502259ad0.png

"开发者说·DTalk" 面向d21d3506-6161-11ed-8abf-dac502259ad0.png中国开发者们征集 Google 移动应用 (apps & games) 相关的产品/技术内容。欢迎大家前来分享您对移动应用的行业洞察或见解、移动开发过程中的心得或新发现、以及应用出海的实战经验总结和相关产品的使用反馈等。我们由衷地希望可以给这些出众的中国开发者们提供更好展现自己、充分发挥自己特长的平台。我们将通过大家的技术内容着重选出优秀案例进行谷歌开发技术专家 (GDE) 的推荐。

d235c760-6161-11ed-8abf-dac502259ad0.gif 点击屏末||即刻报名参与 "开发者说·DTalk"

d29dfc4a-6161-11ed-8abf-dac502259ad0.png

d2d52030-6161-11ed-8abf-dac502259ad0.gif

d2ed2f90-6161-11ed-8abf-dac502259ad0.png


原文标题:Flutter 组件集录: AppBar 的使用 | 开发者说·DTalk

文章出处:【微信公众号:谷歌开发者】欢迎添加关注!文章转载请注明出处。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 谷歌
    +关注

    关注

    27

    文章

    5866

    浏览量

    103279

原文标题:Flutter 组件集录: AppBar 的使用 | 开发者说·DTalk

文章出处:【微信号:Google_Developers,微信公众号:谷歌开发者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    深入理解flutter的编译原理与优化

    摘要: 闲鱼技术-正物 问题背景 对于开发者而言,什么是Flutter?它是用什么语言编写的,包含哪几部分,是如何被编译,运行到设备上的呢?Flutter如何做到Debug模式Hot Reload
    发表于 07-02 17:47

    OpenHarmony开发者文档

    此工程存放OpenHarmony提供的快速入门、开发指南、API参考等开发者文档,欢迎参与OpenHarmony开发者文档开源项目,与我们一起完善开发者文档。View English文
    发表于 04-23 18:08

    【0510活动】9岁鸿蒙开发者

    直说我就是为了社区的活动,来白嫖的。活动链接[讨论] 看了9岁鸿蒙开发者的视频,你有何感想?发布感想,50%概率中奖!虽然是白嫖,但基本操守还是要说点自己的看法的。一、9岁这是本活动谈论的关注点
    发表于 05-12 19:06

    HarmonyOS北向应用开发者 极速入门教程(二)-总述与组件练习

    我们认为鸿蒙应用服务开发者的学习,要从简单,容易的入手,让其快速找到成就感与逐步提升。 我们团队经过一年左右的尝试与实践,觉得基于鸿蒙应用服务开发,从基础的单页面、跳转,到组件、模版练习,到DEMO
    发表于 06-04 16:18

    首批华为鸿蒙系统课程开发者 精选资料分享

    。华为高管王成邀请开发者共建鸿蒙 OS生态与此同时,余承东宣布将鸿蒙 OS 的代码捐赠给开放原子开源基金会进...
    发表于 07-30 06:03

    绝对干货!HarmonyOS开发者日资料全公开,鸿蒙开发者都在看

    731HarmonyOS开发者日大会PPT资料全在这了,想要了解的小伙伴可以自行下载啦~下载资料的小伙伴还可以在评论区回复领取5个积分哦1、HarmonyOS 职业认证解读:该主题是开发者非常关注
    发表于 08-04 14:36

    2021华为开发者大会主题演讲_王成PPT

    整理了一下2021华为开发者大会主题演讲PPT_王成_Al赋能万物智联新时代
    发表于 10-26 08:36

    喜报|HarmonyOS开发者社区连获业内奖项,持续深耕开发者生态

    临近年末,各大平台陆续揭晓年度榜单,表彰了具备强大影响力与做出突出贡献的优秀项目与团队,而HarmonyOS开发者社区作为技术分享,学习和展示的平台,输出高质量技术文章百余篇,连续获得业内各大
    发表于 01-19 14:32

    Flutter 组件: Autocomplete 自动填充 | 开发者说·DTalk

    Flutter 框架内部的组件,非三方组件。目前已收录入 FlutterUnit,下面效果的源码详见之,大家可以更新查看体验:  FlutterUnit 中 输入时联想效果 下面是动态搜索的效果展示
    的头像 发表于 11-10 11:30 702次阅读

    Flutter 3.3 之 SelectionArea 好不好用?用 "Bug" 带您全面了解它 | 开发者说·DTalk

    本文原作者: 恋猫de小郭, 原文 发布于: GSYTech 随着 Flutter 3.3 正式版 发布,Global Selection 终于有了官方的正式支持, 「该功能补全了 Flutter
    的头像 发表于 11-10 11:35 696次阅读

    一文快速带您了解 KMM、Compose 和 Flutter 的现状 | 开发者说·DTalk

    本文原作者: 恋猫de小郭, 原文 发布于: GSYTech 又到了喜闻乐见的环节, 「本篇主要是科普 KMM、Compose 和 Flutter 的最新现状」 ,对于 Compose
    的头像 发表于 12-23 20:55 1564次阅读

    Flutter 共创未来 | Flutter Forward 活动精彩回顾

    作者 / Google 开发者框架和语言 (含 Flutter、Dart 和 Go) 产品经理 用户体验总监 Tim Sneath 我们很高兴可以在 Flutter Forward 活动 上分享我们
    的头像 发表于 02-22 23:20 399次阅读

    Flutter 中国开发者大会 | Flutter Forward Extended China

    Flutter 是一个开源的应用开发框架。只要一套代码库,开发者即可构建、测试和发布适用于移动端、Web 端、桌面端和嵌入式平台的精美应用。作为倍受欢迎的跨平台移动框架, Flutter
    的头像 发表于 03-11 15:25 576次阅读

    为了更好的 Flutter | 2023 第二季度开发者调研

    在年初的 Flutter Forward 大会 上,我们聚焦 突破性的图形性能、Web 应用和移动应用的无缝集成、对新兴架构的早期支持,以及持续关注开发者体验 这四个领域,始终致力于实现 "
    的头像 发表于 06-28 10:10 265次阅读
    为了更好的 <b class='flag-5'>Flutter</b> | 2023 第二季度<b class='flag-5'>开发者</b>调研

    创新不竭,探索不止 | 开发者说·DTalk 年中优秀赏

    Flutter Forward 等),无一不在加深上半年的记忆刻度。我们也依然与您相伴,满怀憧憬地一起进入时间轴的后半段。 "开发者说·DTalk" 栏目很荣幸能够记录开发者
    的头像 发表于 07-14 17:40 229次阅读
    创新不竭,探索不止 | <b class='flag-5'>开发者</b>说·<b class='flag-5'>DTalk</b> 年中优秀赏