Flutter學習總結

從今年五月一之后就開始學習Flutter了,接觸到Flutter之后,才發現Flutter的方便,強大;api對開發者來說真是太友好了,斷斷續續學了一個月后,對FLutter有了一定得了解,總結了一些心得體會;這邊總結存放許久,今天發出來記錄一下,以防丟失,方便自己以后查看復習。

#Widget? everything is widget

StateLessWidget 無狀態Widget? build();構建展示頁面 ,

StatefulWidget 有狀態Widget,

lifecycle:

//the lifecycle of [State]

enum _StateLifecycle {

created,->State.initState() 當前頁面被添加時被調用

initialized,->State.didChangeDependencies() 當前頁面的初始化

State.deactivate()準備移除當前頁面

ready,

State.dispose()當前頁面被移除

defunct,

}

其他:didUpdateWidget()有新widget被添加,熱重載時調用, setState()更新頁面數據 ->build()構建展示頁面 ,

#Scaffold? ? ##demos/LayoutApp.dart

Scaffold :腳手架,相當于Android的Activity,Fragment,實現基本材料設計視覺布局結構。

bottomNavigationBar:底部導航欄

###在Android上:該應用導航到目標的頂級屏幕。重置任何先前的用戶交互和臨時屏幕狀態,例如滾動位置,選項卡選擇和內聯搜索。

在iOS上(CupertinoTabBar):目的地反映了用戶之前的互動。如果用戶先前訪問過應用程序的該部分,則會返回到查看的最后一個屏幕(如果可能,保留其先前狀態)。否則,應用程序會導航到頂級屏幕。

floatingActionButton:懸浮按鈕

drawer:左邊抽屜

endDrawer:右邊抽屜

bottomSheet:底部提示抽屜(靜態,不可消失)

appBar:標題欄

##demos/tab/TabBar.dart

TabBar 一個顯示水平選項卡的Material Design widget。

TabBarView 顯示與當前選中的選項卡相對應的頁面視圖。通常和TabBar一起使用。

#Container? ##demos/container/ContainerDemos.dart

相當于Android里的LinearLayout

Row 行 在水平方向上排列子widget的列表

Column 列 在垂直方向上排列子widget的列表。

Stack 可以允許其子widget簡單的堆疊在一起 (Android FrameLayout)

Container 一個擁有繪制、定位、調整大小的 Widget容器,本身也是Widget

Center 將其子widget居中顯示在自身內部的widget

Wrap 包括容器

Card 帶陰影,圓角的容器

Padding 一個widget, 會給其子widget添加指定的填充

#Widgets Button:? ##demos/LayoutApp.dart

RaiseButton: Material :Design中的button, 一個凸起的材質矩形按鈕? (相當于一個有點擊事件的容器,一般包含一個Text child,onPressed 處理點擊事件,)

FlatButton,一個沒有陰影的材質設計按鈕。(一般只有文案,用于Dialog對話框底部按鈕)

IconButton,用于創建僅包含圖標的按鈕。(跟 RaiseButton有點類似,只是child換成了icon圖標)

DropdownButton,一個顯示可供選擇的選項的按鈕。(能彈出一個類似Dialog樣式的彈窗)

InkWell,實現平面按鈕的墨水飛濺部分。(用法較麻煩,效果不是很明顯)

FloatingActionButton,材質應用程序中的圓形按鈕。(懸浮按鈕,優先級別較大,一般用于BottomBar上,或者主頁上,作為比較重要的邏輯入口)

#國際化? ## demos/international/International.dart

#resources 資源 demos/res/Resources.dart

pubspec.yaml文件中聲明 assets: - images/**.jpg ; assets: - images/這種聲明只適合1.0中有的文件

pubspec.yaml 文件 聲明的資源都會被打包到apk中

#自定義字體? demos/res/Resources.dart

#輸入框 demo/input_select_widgets/InputSelectBox.dart

TextField :文本字段允許用戶輸入文本,可以使用硬件鍵盤,也可以使用屏幕鍵盤。

#選擇框 demo/input_select_widgets/InputSelectBox.dart

CheckBox:復選框,允許用戶從一組中選擇多個選項。(不帶文字,圖標描述)

CheckboxListTile:它將此小部件與ListTile結合使用,以便您可以為復選框指定標簽。(帶文字,圖標描述)

##demo/input_select_widgets/InputSelectBox.dart

Radio:單選框,允許用戶從一組中選擇一個選項。(不帶文字,圖標描述)

RadioListTile:它將此小部件與ListTile結合使用,以便您可以為單選按鈕指定標簽。(帶文字,圖標描述)

##demo/input_select_widgets/InputSelectBox.dart

Switch :On/off 用于切換一個單一狀態(不帶文字,圖標描述)

SwitchListTile,它將此小部件與ListTile結合使用,以便為交換機提供標簽。(帶文字,圖標描述)

##demo/input_select_widgets/InputSelectBox.dart

Slider:滑塊,允許用戶通過滑動滑塊來從一系列值中選擇。

Date & Time Pickers:日期&時間選擇器

#Dialog? demo/dialog/Dialog.dart

SimpleDialog :簡單對話框可以顯示附加的提示或操作

AlertDialog :一個會中斷用戶操作的對話款,需要用戶確認

BottomSheet:是一個從屏幕底部滑起的列表(以顯示更多的內容)。你可以調用showBottomSheet()或showModalBottomSheet彈出

ExpansionPanel:擴展面板包含創建流,允許對元素進行輕量級編輯。expanpanel與ExpansionPanelList結合使用。

SnackBar : 具有可選操作的輕量級消息提示,在屏幕的底部顯示。

#標簽, ## demo/message_widget/MessageWidget.dart

Chip:一個Material widget。 它可以將一個復雜內容實體展現在一個小塊中,如聯系人。

InputChip:一種芯片,以緊湊的形式表示復雜的信息,例如實體(人,地方或事物)或會話文本。

ChoiceChip:允許從一組選項中進行單一選擇。選擇芯片包含相關的描述性文本或類別

## demo/message_widget/MessageWidget.dart

LinearProgressIndicator:線性進度條,

CircularProgressIndicator:圓形進度條

## demo/message_widget/MessageWidget.dart

Stepper:一個Material Design 步驟指示器,顯示一系列步驟的過程

inputChip:

演示視頻 :https://storage.googleapis.com/spec-host-backup/mio-design%2Fassets%2F12UiMVkjIJrWLKyDljDbbSgJQSuTs5vZR%2Fentry-chip-behavior-editable.mp4

https://storage.googleapis.com/spec-host-backup/mio-design%2Fassets%2F1UpLaNgayWmHV8gIGOybjBMGXfsm2KrU2%2Fentry-chip-behavior-expandable.mp4

https://storage.googleapis.com/spec-host-backup/mio-design%2Fassets%2F1yP4gEV5gaomMWK30xoTCO3mSPFwvi7Wv%2Fentry-chip-behavior-draggable.mp4

https://storage.googleapis.com/spec-host-backup/mio-design%2Fassets%2F1fa62nXcCK1CgMTZ28nE0KfE-vkH1aHsm%2Fentry-chip-placement-scrolling.mp4

https://storage.googleapis.com/spec-host-backup/mio-design%2Fassets%2F1fD_fhRHOQl0yc9BtWmzPbtj3gU9qFG4s%2Fentry-chip-behavior-stackable.png

##############################################################################################################################################

Flutter 進階總結

1.bottomNavigationBar:底部導航欄

###在Android上:該應用導航到目標的頂級屏幕。重置任何先前的用戶交互和臨時屏幕狀態,例如滾動位置,選項卡選擇和內聯搜索。

在iOS上(CupertinoTabBar):目的地反映了用戶之前的互動。如果用戶先前訪問過應用程序的該部分,則會返回到查看的最后一個屏幕(如果可能,保留其先前狀態)。否則,應用程序會導航到頂級屏幕。

#IndexedStack

# 可以用OffStage控件解決 用法見? ? lib/youluedu/NavigationBottomBar.dart

Offstage的布局行為完全取決于其offstage參數

## Offstage的作用很簡單,通過一個參數,來控制child是否顯示,日常使用中也算是比較常用的控件。

當offstage為true,當前控件不會被繪制在屏幕上,不會響應點擊事件,也不會占用空間;

當offstage為false,當前控件則跟平常用的控件一樣渲染繪制;

***另外,當Offstage不可見的時候,如果child有動畫,應該手動停掉,Offstage并不會停掉動畫。

2.開屏頁空白

# 官網在android/app/res/values/styles中提供了LaunchTheme主題支持,在清單文件中,設置在MainActivity上,

##LaunchTheme


Flutter draws its first frame -->

@drawable/launch_background

## launch_background

android:gravity="center"

android:src="@mipmap/lake" />

3.? ? RefreshIndicator

## RefreshIndicator(

notificationPredicate: (scrollNotification){

print('----------------depth = ${scrollNotification.depth}');

return scrollNotification.depth==0;

},

semanticsLabel: 'seman label',

semanticsValue: 'seman value',

color: Colors.lightBlueAccent,

backgroundColor: Colors.redAccent,

child: ListView(...)

);

4.WillPopScope

##注冊一個回調函數,以否決用戶試圖取消所附內容的嘗試

###簡單理解:就是在退出頁面前,需要做的一些邏輯(表單數據未保存提醒,連續按兩次返回鍵程序退出)

####系統控件? 自動實現

WillPopScope({

Key key,

@required this.child,//child是頁面具體內容Widget

@required this.onWillPop,//是一個(){}無參回調函數,做邏輯處理,返回false不退出,返回true退出

}) : assert(child != null)

#### 手動注冊方式實現(下面這一套代碼復制到頁面就行)? eg:注意是在當前頁面,不是跳轉頁

ModalRoute _route;

Future callBack() async{ return true;? }

@override

void didChangeDependencies() {

super.didChangeDependencies();

_route?.removeScopedWillPopCallback(callBack);

_route = ModalRoute.of(context);

_route.addScopedWillPopCallback(callBack);

}

@override

void dispose() {

_route.removeScopedWillPopCallback(callBack);

_route = null;

super.dispose();

}

5. flutter隱藏狀態欄,

SystemChrome.setEnabledSystemUIOverlays([]);

6.Redux

#Action : 區分要操作的邏輯分類(一般是 enum 類型 )

#StoreProvider :包裝你的MaterialApp或WidgetsApp。這將確保所有路由都可以訪問

##StoreConnector : 將存儲連接到呈現當前計數的文本小部件,為您的小部件構建一個專門的' ViewModel '(而不是遍歷整個[Store])

##StoreBuilder :通過直接將[Store]傳遞給Build函數來構建小部件。將整個Store對象傳過去,并且不需要初始化后的Store變量

# T xxxReducer(T state, dynamic action) :當State狀態變化時候的回調函數,它會通知StoreProvider去通過熱重載更新最新數據(不是重新走build函數,重建頁面),

# store.dispatch(Actions):響應相關動作,更新數據(發送更新數據通知給? reducer 函數)

總結:每次按下按鈕揮著數據更新,就會發出一個動作并通過reducer運行。在reducer更新狀態之后,小部件將自動使用最新的計數重新構建(熱重載)

7.? webview_flutter

## WebView

initialUrl:初始加載url

javascriptMode:控制javaScript開關

onWebViewCreated:webView創建后的回調

javascriptChannels:與WebView交互的函數集合

navigationDelegate:如何處理導航操作(加載URL之前攔截處理)

onPageFinished:頁面加載完后的回調

### WebViewController 控制WebView頁面的控制器

loadUrl() : 加載Url頁面

reload() :刷新

goBack():返回

goForward():前進

clearCache():清除緩存

......

8. FutureBuilder 基于與[Future]交互的最新snapshot(數據)構建自身的小部件。繼承StatefulWidget

用途:在做一個耗時異步請求時,可以根據不同的狀態構建不同的Widget,eg:網絡請求,請求時展示等待Progress,結束時返回想要構建的界面

future:異步操作對象Future類型,

builder:(context, AsyncSnapshot snapshot) {

snapshot:

snapshot.connectionState:枚舉類

enum ConnectionState {

//future還未執行的快照狀態

none,

//連接到一個異步操作,并且等待交互,一般在這種狀態的時候,我們可以加載個菊花

waiting,

//連接到一個活躍的操作,比如stream流,會不斷地返回值,并還沒有結束,一般也是可以加載個菊花

active,

//異步操作執行結束,一般在這里可以去拿取異步操作執行的結果,并顯示相應的布局

done,

}

snapshot.data ;拿到請求到的數據model

snapshot.error://錯誤信息

}

9.SliverList

other:

##Share (plugin),發送文件,不是分享,只是發出去一個Action,吊起系統的文件發送界面

##EventBus (plugin),輕量級頁面間通訊,(比自己實現callBack簡單,比Redux效率高)

由于編寫的Demo含有公司的部分信息,不方便發出來,后期會做些修改分享出來;

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容