0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Flutter 組件集錄: AppBar 的使用 | 開發(fā)者說(shuō)·DTalk

谷歌開發(fā)者 ? 來(lái)源:未知 ? 2022-11-11 09:45 ? 次閱讀
cfa7c598-6161-11ed-8abf-dac502259ad0.jpg本文原作者: 張風(fēng)捷特烈,原文發(fā)布于: 編程之王

前言

說(shuō)起 AppBar 組件,大家都比較熟悉,默認(rèn)情況下是一個(gè) Material 風(fēng)格的頭部標(biāo)題欄??赡苡腥艘苫?,這么簡(jiǎn)單的東西,有什么好說(shuō)的?其實(shí)該組件一些重要的屬性很多人都不知道,另外在使用過(guò)程中有一些細(xì)節(jié),本文將結(jié)合使用源碼來(lái)詳細(xì)探討一下 AppBar 組件。

如下是 Material 2Material 3 風(fēng)格下默認(rèn)的 AppBar 展示效果:
Material 2 Material 3
cfe09788-6161-11ed-8abf-dac502259ad0.png cfec7206-6161-11ed-8abf-dac502259ad0.png
AppBar(title: const Text('AppBar 組件')),

AppBar 組件的高度

對(duì)于 AppBar 來(lái)說(shuō),最重要的莫過(guò)于它的高度,那它的高度是如何確定的呢?這就不得不說(shuō) PreferredSizeWidget 一族的組件了。如下可見(jiàn),它實(shí)現(xiàn)了 PreferredSizeWidget 類:

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

如下所示,PreferredSizeWidget是一個(gè)抽象類,其中定義了 preferredSize 抽象 get 方法,返回 Size 對(duì)象。也就是說(shuō)該族的組件是需要預(yù)先設(shè)定尺寸的:

abstract class PreferredSizeWidget implements Widget {
Size get preferredSize;
}

所以 AppBar 既然實(shí)現(xiàn) PreferredSizeWidget,就必然實(shí)現(xiàn) preferredSize 方法,返回尺寸。所以根據(jù)這個(gè)線索可以知道高度是如何確定的: AppBar 中定義了preferredSize 成員,所以抽象的 get 方法,將獲取該成員:

AppBar 構(gòu)造方法中,preferredSize 被賦值為 _PreferredAppBarSize 對(duì)象,其中有兩個(gè)入?yún)? toolbarHeight,和 bottom 的高度。

d0209694-6161-11ed-8abf-dac502259ad0.png如下是 _PreferredAppBarSize 類的定義,它繼承自 Size,是一個(gè)專為 AppBar 高度派生的類。Size#fromHeight 構(gòu)造中,寬度無(wú)限大,高度是 toolbarHeightbottomHeight 的和。其中 toolbarHeight 如果為空,會(huì)取 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 組件,在標(biāo)題的底部展示。如下所示,所以可以說(shuō),AppBar 組件的高度就是 toolbarHeightbottom 組件高度之和。d058e418-6161-11ed-8abf-dac502259ad0.png ?
---->[AppBar]----
final PreferredSizeWidget? bottom;
final double? toolbarHeight;

另外,可以通過(guò)參數(shù)指定 toolbarHeight 的值,如下是 40 的效果,可以看出標(biāo)題的高度變小,但并不會(huì)影響 bottom。

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

關(guān)于 AppBar 的高度需要注意的就是這些,一般來(lái)說(shuō) AppBar 作為 Scaffold#appBar 屬性的欽定組件使用,不會(huì)在外界單獨(dú)使用。

AppBar 組件的部位

一個(gè)普通的 AppBar可以包含如下四個(gè)部位,leading 是左側(cè)組件,title 是中間組件,actions 的右側(cè)組件列表。bottom 是底部組件:

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

通過(guò)查看布局效果可以更清晰地看出 AppBar 各部位的占位情況,

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

另外,還有一個(gè) Widlget 類型的 flexibleSpace 屬性,在源碼實(shí)現(xiàn)的過(guò)程中,該組件將通過(guò) Stack 疊放在 AppBar下方。效果如下,如果普通的 AppBar 底部用貼圖的需求,可以使用這個(gè)屬性:

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

部位相關(guān)控制屬性

下面介紹一些關(guān)于部位的屬性: centerTitle 是一個(gè) bool 值,可以控制 title 是否居中顯示。這個(gè)是在整體的居中,所以 AppBar 的標(biāo)題欄并不是一個(gè)簡(jiǎn)單的 Row 組件包裹,具體地實(shí)現(xiàn)細(xì)節(jié),將在源碼分析中介紹:

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

toolbarOpacitybottomOpacity 分別用來(lái)控制標(biāo)題欄和底欄的透明度,取值范圍是 [0 ~ 1],默認(rèn)是 1 不透明。一般來(lái)說(shuō)很少有這種需求,了解一下即可:

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

titleSpacing 是一個(gè) double 值,用于控制標(biāo)題欄和區(qū)域左側(cè)的間隔,默認(rèn)情況下根據(jù) Material 的風(fēng)格有一定的空間,該值為 16:

d125143e-6161-11ed-8abf-dac502259ad0.png所以想要消除這個(gè)間距,讓 titleSpacing 置零即可: d13208f6-6161-11ed-8abf-dac502259ad0.png ?
final double? titleSpacing;
titleSpacing 是一個(gè) double 值,用于控制左側(cè) leading 的區(qū)域?qū)挾?,默認(rèn)情況下是 56,呈正方形:d13d009e-6161-11ed-8abf-dac502259ad0.png ?
final double? leadingWidth;

AppBar 樣式屬性

可以通過(guò) shape 屬性設(shè)置 AppBar 形狀,如下是通過(guò) RoundedRectangleBorder 設(shè)置的圓角矩形。另外 elevationshadowColor 分別表示陰影的深度和陰影顏色:

d154bd2e-6161-11ed-8abf-dac502259ad0.png ?
參數(shù) 類型 描述
shadowColor Color? 陰影顏色
elevation double 影深
shape ShapeBorder? 形狀
d15f5c52-6161-11ed-8abf-dac502259ad0.png

另外通過(guò)去除陰影、設(shè)置背景色,也可以很輕松地?cái)[脫 Material 風(fēng)格。其中通過(guò)了 iconTheme 來(lái)配置 AppBar 中的默認(rèn)圖標(biāo)主題,這樣如果存在多個(gè)按鈕,方便統(tǒng)一配置,避免一個(gè)個(gè)設(shè)置的麻煩。actionsIconTheme 的圖標(biāo)樣式優(yōu)先作用于 actions 屬性中的組件。 另外,toolbarTextStyle 為工具條區(qū)域內(nèi)的所有文字通過(guò)默認(rèn)樣式,titleTextStyle 配置的默認(rèn)標(biāo)題文字主題,優(yōu)先級(jí)較高。

參數(shù) 類型 描述
backgroundColor Color? 背景色
iconTheme IconThemeData? 圖標(biāo)樣式
actionsIconTheme IconThemeData? 右側(cè)圖標(biāo)樣式
titleTextStyle TextStyle? 標(biāo)題文字樣式
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 的使用細(xì)節(jié)

AppBar 在構(gòu)造時(shí)可以傳入 automaticallyImplyLeading 屬性,用于控制是否在 leadingnull 時(shí),根據(jù)場(chǎng)景自動(dòng)添加某些圖標(biāo): 比如 Scaffloddrawer 屬性非空時(shí),會(huì)自動(dòng)提供 leading,點(diǎn)擊時(shí)響應(yīng)事件打開 drawer。

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

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

還有當(dāng)跳轉(zhuǎn)界面時(shí),如果使用了 AppBar 并且未提供 leading,會(huì)自動(dòng)添加返回按鈕。如果不想啟用這個(gè)功能,將 automaticallyImplyLeading 置為 false 即可。

AppBar的使用過(guò)程中,有一個(gè)非常重要,可能很少人注意的一點(diǎn): AppBar 的背景色可以影響頂部狀態(tài)欄的顏色。比如默認(rèn)情況下背景色是藍(lán)色,狀態(tài)欄是白色:

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

如果背景色是白色,狀態(tài)欄就會(huì)是黑色,這樣就很方便。

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

如果不使用 AppBar,也能界面跳著跳著狀態(tài)欄就錯(cuò)亂了。比如類似下面的情況。通過(guò)源碼可以知道 AppBar 中會(huì)通過(guò) AnnotatedRegion 維護(hù)狀態(tài)欄的顏色。

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

如果狀態(tài)欄的顏色和您預(yù)期的不同,可以通過(guò) systemOverlayStyle 屬性來(lái)設(shè)置狀態(tài)欄的顏色,如下 light 會(huì)將狀態(tài)欄圖標(biāo)的顏色變白:

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

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

關(guān)于 AppBar 的使用基本上就是這些,總的來(lái)看,AppBar 算是一個(gè)比較優(yōu)秀的組件,使用很靈活,能滿足絕大多數(shù)的頭部欄使用場(chǎng)景。如果您在日常開發(fā)中還自己用 Row 來(lái)拼裝,那不妨試試 AppBar 組件。


長(zhǎng)按右側(cè)二維碼

查看更多開發(fā)者精彩分享

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

"開發(fā)者說(shuō)·DTalk" 面向d21d3506-6161-11ed-8abf-dac502259ad0.png中國(guó)開發(fā)者們征集 Google 移動(dòng)應(yīng)用 (apps & games)?相關(guān)的產(chǎn)品/技術(shù)內(nèi)容。歡迎大家前來(lái)分享您對(duì)移動(dòng)應(yīng)用的行業(yè)洞察或見(jiàn)解、移動(dòng)開發(fā)過(guò)程中的心得或新發(fā)現(xiàn)、以及應(yīng)用出海的實(shí)戰(zhàn)經(jīng)驗(yàn)總結(jié)和相關(guān)產(chǎn)品的使用反饋等。我們由衷地希望可以給這些出眾的中國(guó)開發(fā)者們提供更好展現(xiàn)自己、充分發(fā)揮自己特長(zhǎng)的平臺(tái)。我們將通過(guò)大家的技術(shù)內(nèi)容著重選出優(yōu)秀案例進(jìn)行谷歌開發(fā)技術(shù)專家 (GDE)?的推薦。

d235c760-6161-11ed-8abf-dac502259ad0.gif?點(diǎn)擊屏末||即刻報(bào)名參與 "開發(fā)者說(shuō)·DTalk"

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

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

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


原文標(biāo)題:Flutter 組件集錄: AppBar 的使用 | 開發(fā)者說(shuō)·DTalk

文章出處:【微信公眾號(hào):谷歌開發(fā)者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 谷歌
    +關(guān)注

    關(guān)注

    27

    文章

    6099

    瀏覽量

    104773

原文標(biāo)題:Flutter 組件集錄: AppBar 的使用 | 開發(fā)者說(shuō)·DTalk

文章出處:【微信號(hào):Google_Developers,微信公眾號(hào):谷歌開發(fā)者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    2021華為開發(fā)者大會(huì)主題演講_王成PPT

    整理了一下2021華為開發(fā)者大會(huì)主題演講PPT_王成_Al賦能萬(wàn)物智聯(lián)新時(shí)代
    發(fā)表于 10-26 08:36

    華為開發(fā)者大會(huì)2021 華為開發(fā)者的年度盛會(huì)

    華為開發(fā)者大會(huì)2021作為華為開發(fā)者的年度盛會(huì),開發(fā)者們可以在HDC上見(jiàn)到鴻蒙幕后的“神秘”開發(fā)團(tuán)隊(duì),還有可能和余承東、王成等行業(yè)大咖、專
    的頭像 發(fā)表于 10-23 15:30 ?1598次閱讀
    華為<b class='flag-5'>開發(fā)者</b>大會(huì)2021 華為<b class='flag-5'>開發(fā)者</b>的年度盛會(huì)

    Flutter 組件: Autocomplete 自動(dòng)填充 | 開發(fā)者說(shuō)·DTalk

    Flutter 框架內(nèi)部的組件,非三方組件。目前已收錄入 FlutterUnit,下面效果的源碼詳見(jiàn)之,大家可以更新查看體驗(yàn):? FlutterUnit 中 輸入時(shí)聯(lián)想效果 下面是動(dòng)態(tài)搜索的效果展示
    的頭像 發(fā)表于 11-10 11:30 ?1127次閱讀

    Flutter 3.3 之 SelectionArea 好不好用?用 "Bug" 帶您全面了解它 | 開發(fā)者說(shuō)·DTalk

    本文原作者: 戀貓de小郭, 原文 發(fā)布于:?GSYTech 隨著 Flutter 3.3 正式版 發(fā)布,Global Selection 終于有了官方的正式支持, 「該功能補(bǔ)全了 Flutter
    的頭像 發(fā)表于 11-10 11:35 ?970次閱讀

    一文快速帶您了解 KMM、Compose 和 Flutter 的現(xiàn)狀 | 開發(fā)者說(shuō)·DTalk

    它? 起因如下圖所示,最近有人提及了 KMM,并且用了 "變天" 的詞匯,頓時(shí)就勾起了我的興趣,因?yàn)?KMM 這些年來(lái)一直 "不溫不火",可以說(shuō)很多使用 Kotlin 開發(fā)
    的頭像 發(fā)表于 12-23 20:55 ?2202次閱讀

    Flutter 共創(chuàng)未來(lái) | Flutter Forward 活動(dòng)精彩回顧

    作者 / Google 開發(fā)者框架和語(yǔ)言 (含 Flutter、Dart 和 Go) 產(chǎn)品經(jīng)理 用戶體驗(yàn)總監(jiān) Tim Sneath 我們很高興可以在 Flutter Forward 活動(dòng) 上分享我們
    的頭像 發(fā)表于 02-22 23:20 ?532次閱讀

    Flutter 中國(guó)開發(fā)者大會(huì) | Flutter Forward Extended China

    Flutter 是一個(gè)開源的應(yīng)用開發(fā)框架。只要一套代碼庫(kù),開發(fā)者即可構(gòu)建、測(cè)試和發(fā)布適用于移動(dòng)端、Web 端、桌面端和嵌入式平臺(tái)的精美應(yīng)用。作為倍受歡迎的跨平臺(tái)移動(dòng)框架, Flutter
    的頭像 發(fā)表于 03-11 15:25 ?737次閱讀

    報(bào)名開啟 | 共赴一場(chǎng) Flutter 的春日宴

    2023 年 1 月 25 日, Flutter Forward 大會(huì) 在肯尼亞首都內(nèi)羅畢成功舉辦,吸引了全球范圍內(nèi)開發(fā)者廣泛的關(guān)注和反饋。為了擴(kuò)大 Flutter Forward 活動(dòng)在全球
    的頭像 發(fā)表于 03-24 07:20 ?1030次閱讀

    為了更好的 Flutter | 2023 第二季度開發(fā)者調(diào)研

    在年初的 Flutter Forward 大會(huì) 上,我們聚焦 突破性的圖形性能、Web 應(yīng)用和移動(dòng)應(yīng)用的無(wú)縫集成、對(duì)新興架構(gòu)的早期支持,以及持續(xù)關(guān)注開發(fā)者體驗(yàn) 這四個(gè)領(lǐng)域,始終致力于實(shí)現(xiàn) "
    的頭像 發(fā)表于 06-28 10:10 ?369次閱讀
    為了更好的 <b class='flag-5'>Flutter</b> | 2023 第二季度<b class='flag-5'>開發(fā)者</b>調(diào)研

    創(chuàng)新不竭,探索不止 | 開發(fā)者說(shuō)·DTalk 年中優(yōu)秀賞

    Flutter Forward 等),無(wú)一不在加深上半年的記憶刻度。我們也依然與您相伴,滿懷憧憬地一起進(jìn)入時(shí)間軸的后半段。 "開發(fā)者說(shuō)·DTalk" 欄目很榮幸能夠記錄
    的頭像 發(fā)表于 07-14 17:40 ?328次閱讀
    創(chuàng)新不竭,探索不止 | <b class='flag-5'>開發(fā)者</b><b class='flag-5'>說(shuō)</b>·<b class='flag-5'>DTalk</b> 年中優(yōu)秀賞

    社區(qū)說(shuō) | 精益求精: Flutter 技巧專題篇

    Flutter 作為深受歡迎的跨平臺(tái)開發(fā)框架,迄今為止已有超過(guò) 70 萬(wàn)款使用 Flutter 打造的應(yīng)用上架。開源生態(tài)社區(qū)更是有超過(guò) 20% 的中國(guó)開發(fā)者作出貢獻(xiàn)。 本次
    的頭像 發(fā)表于 07-25 17:45 ?413次閱讀
    社區(qū)<b class='flag-5'>說(shuō)</b> | 精益求精: <b class='flag-5'>Flutter</b> 技巧專題篇

    【今晚開播】社區(qū)說(shuō) | 精益求精: Flutter 技巧專題篇

    Flutter 作為深受歡迎的跨平臺(tái)開發(fā)框架,迄今為止已有超過(guò) 70 萬(wàn)款使用 Flutter 打造的應(yīng)用上架。開源生態(tài)社區(qū)更是有超過(guò) 20% 的中國(guó)開發(fā)者作出貢獻(xiàn)。 本次
    的頭像 發(fā)表于 07-27 17:40 ?378次閱讀
    【今晚開播】社區(qū)<b class='flag-5'>說(shuō)</b> | 精益求精: <b class='flag-5'>Flutter</b> 技巧專題篇

    開發(fā)者說(shuō)】傳遞美好的積極布道——堅(jiān)果

    # 開發(fā)者說(shuō) # 【開發(fā)者說(shuō)】欄目是為HarmonyOS開發(fā)者提供的展示和分享平臺(tái),在這里,大家可以發(fā)表自己的技術(shù)洞察和見(jiàn)解,也可以展示自己
    的頭像 發(fā)表于 08-23 09:15 ?440次閱讀
    【<b class='flag-5'>開發(fā)者</b><b class='flag-5'>說(shuō)</b>】傳遞美好的積極布道<b class='flag-5'>者</b>——堅(jiān)果

    開發(fā)者說(shuō)開發(fā)案例:使用canvas實(shí)現(xiàn)圖表系列之折線圖

    # 開發(fā)者說(shuō) # 【開發(fā)者說(shuō)】欄目是為HarmonyOS開發(fā)者提供的展示和分享平臺(tái),在這里,大家可以發(fā)表自己的技術(shù)洞察和見(jiàn)解,也可以展示自己
    的頭像 發(fā)表于 12-13 16:05 ?531次閱讀
    【<b class='flag-5'>開發(fā)者</b><b class='flag-5'>說(shuō)</b>】<b class='flag-5'>開發(fā)</b>案例:使用canvas實(shí)現(xiàn)圖表系列之折線圖

    開發(fā)者說(shuō)】HarmonyOS實(shí)踐之應(yīng)用狀態(tài)變量共享

    # 開發(fā)者說(shuō) # 【開發(fā)者說(shuō)】欄目是為HarmonyOS開發(fā)者提供的展示和分享平臺(tái),在這里,大家可以發(fā)表自己的技術(shù)洞察和見(jiàn)解,也可以展示自己
    的頭像 發(fā)表于 12-26 21:20 ?709次閱讀
    【<b class='flag-5'>開發(fā)者</b><b class='flag-5'>說(shuō)</b>】HarmonyOS實(shí)踐之應(yīng)用狀態(tài)變量共享