在App設(shè)計中狀態(tài)欄純色的這種設(shè)計很常見,但是如果狀態(tài)欄需要為白色的時候就必須為黑色字體。在Android中已經(jīng)有很多成熟的方案來處理這種情況,那我們現(xiàn)在看看在Flutter中這種情況該怎么處理。
公司專注于為企業(yè)提供成都網(wǎng)站設(shè)計、做網(wǎng)站、微信公眾號開發(fā)、商城開發(fā),成都微信小程序,軟件定制網(wǎng)站開發(fā)等一站式互聯(lián)網(wǎng)企業(yè)服務(wù)。憑借多年豐富的經(jīng)驗,我們會仔細(xì)了解各客戶的需求而做出多方面的分析、設(shè)計、整合,為客戶設(shè)計出具風(fēng)格及創(chuàng)意性的商業(yè)解決方案,創(chuàng)新互聯(lián)建站更提供一系列網(wǎng)站制作和網(wǎng)站推廣的服務(wù)。
這里的ThemeData即為控制App的主題,primarySwatch設(shè)置即可控制主題的各類顏色,但是這里的顏色是需要MaterialColor,但是純色種的黑色和白色不是MaterialColor。所以不能設(shè)置primarySwatch為Colors.white。
注:MaterialColor包含以下這些
那么就只能使用其他方式設(shè)置主題為白色。即為設(shè)置
此時我們可以看到App的狀態(tài)欄如下所示(Android)
雖然AppBar變成了白色,但是狀態(tài)欄是灰色顯然不是我們想要的。
嘗試設(shè)置文字顏色,AppBar的Brightness有兩種模式light和dark
這個和SystemUiOverlayStyle的light和dark剛好相反
然后設(shè)置狀態(tài)欄顏色
設(shè)置為紅色之后,得到以下的樣式,可以看到狀態(tài)欄為紅色了,文字為白色
那么接下來我們只需要將狀態(tài)欄設(shè)置為白色或者透明,狀態(tài)欄文字設(shè)置為黑色。
最后得到以下視圖
注:使用PreferredSize包裹,可以更得心應(yīng)手哦!
SystemUiOverlayStyle在設(shè)置時其實有很多系統(tǒng)或者版本的限制
[Flutter]使用主題
flutter設(shè)置沉浸式狀態(tài)欄
)
Flutter狀態(tài)管理系列:
Flutter狀態(tài)管理(一):ScopedModel
Flutter狀態(tài)管理(二):Provider
Flutter狀態(tài)管理(三):BLoC(Business Logic Component)
Flutter狀態(tài)管理(四):ReactiveX之RxDart
Flutter狀態(tài)管理(五):Redux
有做過H5前端開發(fā)的朋友應(yīng)該很早就接觸過這個,Redux在React/VUE中,與在Flutter/Dart中概念一樣,沒有任何區(qū)別;唯一的區(qū)別只是使用上的不同。
它主要由三部分組成:
下圖是一個完整的數(shù)據(jù)觸發(fā)及更新流程:
我們看到上面整個數(shù)據(jù)流,都是單向的,由View發(fā)起,最后到View的更新;
為啥這樣設(shè)計?
小節(jié)二介紹了Redux最基本的原理,但是,如何用Redux來做一些異步操作,比如:加載數(shù)據(jù)、請求API等?這里就引出來了Redux的中間件(Middleware),中間件能夠讓我們使得action在到達(dá)reducer之前,做些其它“動作”!有了中間件,我們不但可以請求API,還可以改變action,使得分發(fā)到其它reducer中去;
上圖是有Middleware的流程圖。
Redux在Flutter中的使用與在JavaScript中的使用方式稍微有點不同,為啥?
因為JavaScript是弱類型語言,而Dart是強類型語言,這就使得在JS中每個reducer可以獨立管理,而在Flutter中需要由一個大對象來管理!
無論在JS中還是在Flutter中,通常都將action、reducer、store各自建一目錄,放在redux目錄下,目錄結(jié)構(gòu)如下:
ReduxPage在build中,也可以直接用StoreBuilder(參考ReduxPage2中寫法),因為StoreBuilder也是InheritedWidget。
正因為Redux在Flutter中與在JS中不同,因此,在Flutter中,建議:
Flutter (二)布局
Flutter (三) 狀態(tài)管理
Flutter (四) Map轉(zhuǎn)模型
Flutter (五) 網(wǎng)絡(luò)請求
Flutter (六) 保留界面狀態(tài)
Flutter (七) 混合開發(fā) [配置]
Flutter (八) 混合開發(fā) [Flutter完整項目嵌入到原生]
Flutter有兩個常用的狀態(tài)類:
標(biāo)記為dirty,執(zhí)行的markNeedsBuild,定義在Element類中:
當(dāng)前Element節(jié)點被標(biāo)記為dirty,同時調(diào)用owner的scheduleBuildFor方法:
將element元素添加到全局的“臟”鏈表里。
BuildOwner用來管理哪些需要更新的Widget。這個owner最開始被初始化的地方在WidgetsBinding的initInstances方法中,隨后初始化了onBuildScheduled方法,對應(yīng)執(zhí)行的是_handleBuildScheduled,定義在WidgetsBinding類中:
ensureVisualUpdate 方法定義在SchedulerBinding類中:
在提交下一幀繪制的時候會調(diào)用到scheduleFrame方法,提交給引擎繪制,看看scheduleFrame方法,也定義在SchedulerBinding類中:
提交給引擎繪制之后,會收到onDrawFrame的回調(diào),最終執(zhí)行到_handleDrawFrame方法中,對應(yīng)的是handleDrawFrame方法,定義在SchedulerBinding類中:
在RendererBinding的initInstances方法中添加了一個回調(diào)到這個List中,對應(yīng)的是RenderBinding的drawFrame方法,對應(yīng)的節(jié)點進(jìn)行繪制渲染操作。
WidgetsBinding中的drawFrame方法:
看看這里的buildScope方法,定義在BuildOwner方法中。在上面 scheduleBuildFor 方法介紹中有提到:"scheduleBuildFor 是把一個 element 添加到 _dirtyElements 鏈表,以便當(dāng)[WidgetsBinding.drawFrame]中調(diào)用 buildScope 的時候能夠重構(gòu) element。onBuildScheduled()是一個 BuildOwner 的回調(diào)"。在 drawFrame 中調(diào)用 buildOwner.buildScope(renderViewElement)更新 elements。
_dirtyElements列表在遍歷的過程中執(zhí)行rebuild方法,此時將所有標(biāo)記為dirty的Element節(jié)點依次執(zhí)行rebuild,preformRebuild,build,updateChild,update方法,執(zhí)行界面更新。完成build,update操作完成之后,后續(xù)會將需要繪制的RenderObject添加到需要layout的列表中,等待繪制渲染。所有繪制完成之后將_dirtyElments列表清空,_inDirtyList標(biāo)記位置為false。
提交給引擎繪制渲染
看看super.drawFrame(),這里就執(zhí)行到了RendererBinding類中,定義如下:
這里就是將最終需要繪制渲染的畫面提交給引擎的地方了,繪制完成之后就在界面顯示更新后的視圖了。
當(dāng)前題目:flutter設(shè)置狀態(tài),flutter 配置文件
鏈接分享:http://jinyejixie.com/article12/dsecidc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營銷推廣、企業(yè)網(wǎng)站制作、外貿(mào)建站、網(wǎng)站制作、定制網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)