<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
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

    文章

    5879

    瀏覽量

    103331

原文標題: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 ?717次閱讀

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

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

    一文快速帶您了解 KMM、Compose 和 Flutter 的現狀 | 開發者說·DTalk

    本文原作者: 戀貓de小郭, 原文 發布于: GSYTech 又到了喜聞樂見的環節, 「本篇主要是科普 KMM、Compose 和 Flutter 的最新現狀」 ,對于 Compose
    的頭像 發表于 12-23 20:55 ?1587次閱讀

    Flutter 共創未來 | Flutter Forward 活動精彩回顧

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

    Flutter 中國開發者大會 | Flutter Forward Extended China

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

    為了更好的 Flutter | 2023 第二季度開發者調研

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

    創新不竭,探索不止 | 開發者說·DTalk 年中優秀賞

    Flutter Forward 等),無一不在加深上半年的記憶刻度。我們也依然與您相伴,滿懷憧憬地一起進入時間軸的后半段。 "開發者說·DTalk" 欄目很榮幸能夠記錄開發者
    的頭像 發表于 07-14 17:40 ?232次閱讀
    創新不竭,探索不止 | <b class='flag-5'>開發者</b>說·<b class='flag-5'>DTalk</b> 年中優秀賞
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>