主要屬性
創(chuàng)新新互聯(lián),憑借10多年的成都做網(wǎng)站、成都網(wǎng)站設計經(jīng)驗,本著真心·誠心服務的企業(yè)理念服務于成都中小企業(yè)設計網(wǎng)站有近千家案例。做網(wǎng)站建設,選成都創(chuàng)新互聯(lián)。
//創(chuàng)建一個帶 title 的 item
//通過傳入 length 多少個來創(chuàng)建多少個 item
最近在開發(fā)中想實現(xiàn)一個AppBar下面有選項卡,來回切換的頁面功能,百度了很多沒有和自己需求符合的,網(wǎng)上大都是返回的Scaffold,使用系統(tǒng)的Appbar,添加至.bottom中,但是現(xiàn)在項目中用的是自定義的Appbar,不想破壞系統(tǒng)的統(tǒng)一封裝。
所以在body 中實現(xiàn)TabBar 和 TabBarView,開始使用Column一直不行,只能顯示一個,但是在body里面同時放置 TabBar 和 TabBarView需要注意
TabBarView 的父 Widget 必須知道寬高才能布局,否則,會報錯:BoxConstraints forces an infinite height.
使用 Column + Expanded 即可:
注:還有設置tabbar的tab背景顏色,tabbar中的tab的背景顏色取的實際是AppBar的主題色,所以我們將tabbar放在Material中來重置了主題色,變成我們想要的背景色.
buildTabBar為創(chuàng)建TabBar的方法:
buildBodyView創(chuàng)建視圖方法:
新建一個Flutter工程,android模塊。
1,只有一個Activity組件,它是Dart層繪制Widget的容器。
2,Application配置FlutterApplication。
應用Application配置io.flutter.app.FlutterApplication類,App首次啟動時,初始化。
調(diào)用FlutterMain.startInitialization()方法。
initConfig方法,從AndroidManfest.xml配置的applicaion節(jié)點獲取meta-data數(shù)據(jù),初始化以下默認值。
這些值都是使用中用到的name,例如,抽取apk中asset資源時,flutter_assets打包目錄,打包產(chǎn)物data名稱。
initResources方法, 初始化資源。
在Flutter打包apk的asset目錄下,包括fluttter_asset目錄/資源項,將資源從apk中抽取,保存在 Context.getDir("flutter", 0) 目錄下。
/data/user/0/包名/app_flutter目錄。
在目錄中創(chuàng)建一個時間戳文件,根據(jù)apk版本和包信息記錄的lastUpdateTime更新時間,第二次啟動時,若apk未更新,不需要再次抽取。
加載so庫,libflutter.so,System.loadLibrary()。
主頁面繼承FlutterActivity,配置啟動模式singleTop。
FlutterActivity類在io.flutter.app包, (區(qū)別io.flutter.embedding.android包), 組件生命周期委托給FlutterActivityDelegate類。
組件啟動,onCreate方法。
FlutterMain.ensureInitializationComplete方法,確保資源成功抽取完成,創(chuàng)建FlutterView視圖(io.flutter.view),繼承SurfaceView類,setContentView方法,設置組件主布局即FlutterView視圖。
最后,根據(jù)Bundle路徑,runBundle()加載運行,
調(diào)用FlutterView的runFromBundle方法,入口點在dart的main方法,
通過FlutterNativeView,調(diào)用FlutterJNI的native方法。
nativeRunBundleAndSnapshotFromLibrary方法。
任重而道遠
對于初學flutter的朋友來說,要知道,flutter的UI萬物皆Widget。
flutter所寫的頁面的結(jié)構(gòu)可以被看成套娃,一層套一層,一層套一層,一層套一層。。。。。。
Flutter Widget采用現(xiàn)代響應式框架構(gòu)建,這是從 React 中獲得的靈感,中心思想是用widget構(gòu)建你的UI。 Widget描述了他們的視圖在給定其當前配置和狀態(tài)時應該看起來像什么。當widget的狀態(tài)發(fā)生變化時,widget會重新構(gòu)建UI,F(xiàn)lutter會對比前后變化的不同, 以確定底層渲染樹從一個狀態(tài)轉(zhuǎn)換到下一個狀態(tài)所需的最小更改。
Text : 該 widget 可讓創(chuàng)建一個帶格式的文本。
Row 、 Column : 這些具有彈性空間的布局類Widget可讓您在水平( Row )和垂直( Column )方向上創(chuàng)建靈活的布局。
Stack :取代線性布局 (和Android中的LinearLayout相似),Stack允許子 widget 堆疊, 你可以使用 Positioned 來定位他們相對于 Stack 的上下左右四條邊的位置。
Container : Container 可讓您創(chuàng)建矩形視覺元素。 您可以為 Container 裝飾一個 BoxDecoration , 如 background、一個邊框、或者一個陰影。 Container 也可以具有邊距(margins)、填充(padding)和應用于其大小的約束(constraints)。另外, Container 可以使用矩陣在三維空間中對其進行變換。
具體的演示見我另外的博客
有一部分Widget都有一個 child 屬性,用于容納唯一的子Widget。
例如:Container、Center、Padding、Align等Widget。
還有一部分Widget允許存在多個子Widget,用 children 作為屬性。
例如:Row、Column、Stack等Widget。
在StatefulWidget調(diào)用createState之后,框架將新的狀態(tài)插入樹種,然后調(diào)用狀態(tài)對象的initState。子類化State可以重寫initState,以完成僅需要一次執(zhí)行的工作。當然在initState的實現(xiàn)中需要調(diào)用super.initState
當一個狀態(tài)對象不再需要時,框架調(diào)用狀態(tài)對象的dispose。也可以通過覆蓋dispose方法來執(zhí)行清理工作。
OVER~