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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

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

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

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

前言

說起 AppBar 組件,大家都比較熟悉,默認情況下是一個 Material 風格的頭部標題欄??赡苡腥艘苫?,這么簡單的東西,有什么好說的?其實該組件一些重要的屬性很多人都不知道,另外在使用過程中有一些細節(jié),本文將結合使用源碼來詳細探討一下 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 一族的組件了。如下可見,它實現(xiàn)了 PreferredSizeWidget 類:

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

如下所示,PreferredSizeWidget是一個抽象類,其中定義了 preferredSize 抽象 get 方法,返回 Size 對象。也就是說該族的組件是需要預先設定尺寸的:

abstract class PreferredSizeWidget implements Widget {
Size get preferredSize;
}

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

AppBar 構造方法中,preferredSize 被賦值為 _PreferredAppBarSize 對象,其中有兩個入?yún)? 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;

另外,可以通過參數(shù)指定 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 屬性,在源碼實現(xiàn)的過程中,該組件將通過 Stack 疊放在 AppBar下方。效果如下,如果普通的 AppBar 底部用貼圖的需求,可以使用這個屬性:

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

部位相關控制屬性

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

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 值,用于控制標題欄和區(qū)域左側的間隔,默認情況下根據(jù) Material 的風格有一定的空間,該值為 16:

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

AppBar 樣式屬性

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

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

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

參數(shù) 類型 描述
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 的使用細節(jié)

AppBar 在構造時可以傳入 automaticallyImplyLeading 屬性,用于控制是否在 leadingnull 時,根據(jù)場景自動添加某些圖標: 比如 Scaffloddrawer 屬性非空時,會自動提供 leading,點擊時響應事件打開 drawer。

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

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

還有當跳轉界面時,如果使用了 AppBar 并且未提供 leading,會自動添加返回按鈕。如果不想啟用這個功能,將 automaticallyImplyLeading 置為 false 即可。

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

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

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

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

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

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

如果狀態(tài)欄的顏色和您預期的不同,可以通過 systemOverlayStyle 屬性來設置狀態(tài)欄的顏色,如下 light 會將狀態(tài)欄圖標的顏色變白:

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

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

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


長按右側二維碼

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

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

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

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

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

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

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


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

文章出處:【微信公眾號:谷歌開發(fā)者】歡迎添加關注!文章轉載請注明出處。

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

    關注

    27

    文章

    6168

    瀏覽量

    105397

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

文章出處:【微信號:Google_Developers,微信公眾號:谷歌開發(fā)者】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    鴻蒙Flutter實戰(zhàn):07混合開發(fā)

    。 其優(yōu)點是主項目開發(fā)者可以不關注Flutter實現(xiàn),不需要安裝配置Flutter開發(fā)環(huán)境,缺點是無法及時修改Flutter代碼,也不存在
    發(fā)表于 10-23 16:00

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

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

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

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

    Flutter 組件: Autocomplete 自動填充 | 開發(fā)者·DTalk

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

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

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

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

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

    Flutter 共創(chuàng)未來 | Flutter Forward 活動精彩回顧

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

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

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

    報名開啟 | 共赴一場 Flutter 的春日宴

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

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

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

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

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

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

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

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

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

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

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

    開發(fā)者】HarmonyOS實踐之應用狀態(tài)變量共享

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