1,日志打印工具? ?logger?
https://pub.dev/packages/logger
2.1,網(wǎng)絡(luò)框架? dio
2.2,網(wǎng)絡(luò)框架 http
https://pub.dev/packages/http
2.3,Flutter自帶網(wǎng)絡(luò)框架HttpClient,雖然也支持忽略證書请梢,但是代碼比較啰嗦氏捞,不推薦
dio目前我沒有找到合適的支持忽略證書的方式捶码,所以給出另一個(gè)第三方庫(kù)的http的完美封裝,地址如下:http://www.reibang.com/p/f0806375668d
3,常用工具類集合
4,Toast工具類
5穆咐,設(shè)置隱藏狀態(tài)欄
void main() {
runApp(new MyApp());
? if(Platform.isAndroid){
// 以下兩行 設(shè)置android狀態(tài)欄為透明的沉浸。寫在組件渲染之后,是為了在渲染后進(jìn)行set賦值葛躏,覆蓋狀態(tài)欄局齿,寫在渲染之前MaterialApp組件會(huì)覆蓋掉這個(gè)值剧劝。
? ? SystemUiOverlayStyle systemUiOverlayStyle =
SystemUiOverlayStyle(statusBarColor: Colors.transparent);
? ? SystemChrome.setSystemUIOverlayStyle(systemUiOverlayStyle);
? }
}
6,路由跳轉(zhuǎn)
Navigator.push(context, MaterialPageRoute(builder:(context) =>NewScreen()));
7抓歼,設(shè)置倒計(jì)時(shí)
Timer timer = new?Timer(const Duration(milliseconds:1500),(){
Navigator.of(context).push(new MaterialPageRoute(
builder: (BuildContext context) =>new Home()
));
});
8,mainaxisalignment和crossaxisalignment
垂直布局時(shí):y軸為主軸讥此,x軸為副軸!
水平不就是:x軸為主軸拢锹,y軸為副軸!
9,EdgeInsets的基類暂论,允許文本方向感知分辨率面褐。
此類型的屬性或參數(shù)接受使用新EdgeInsets.fromLTRB及其變體或新EdgeInsetsDirectional.fromSTEB及其變體創(chuàng)建的類。
要將不確定類型的EdgeInsetsGeometry對(duì)象轉(zhuǎn)換為EdgeInsets對(duì)象取胎,請(qǐng)調(diào)用resolve方法展哭。
10,mixin是什么
對(duì)于熟悉java來說的闻蛀,這個(gè)概念比較新匪傍。從個(gè)人理解來看,可以把它想象為Kotlin中的接口(和Java的區(qū)別是可以帶非抽象的屬性和方法)觉痛,而多個(gè)mixin可以相互覆蓋以實(shí)現(xiàn)組合役衡,提供了非常大的靈活性,也可以達(dá)到類似多重繼承的效果薪棒。
mixin本身可以是抽象的手蝎,可以定義各種方法屬性,也可以是抽象的俐芯,等后續(xù)類去實(shí)現(xiàn) 棵介。如果mixin存在沖突的部分,后面會(huì)覆蓋前面的吧史,沒有沖突的則會(huì)保留邮辽,所以可以存在后面的mixin修改了前面的mixin的一部分邏輯的情況,不需要直接繼承即可實(shí)現(xiàn)覆蓋贸营,避免了更復(fù)雜的繼承關(guān)系吨述。
例如,通過?SingleTickerProviderStateMixin??實(shí)現(xiàn) Tab 的動(dòng)畫切換效果?(ps 如果有需要多個(gè)嵌套動(dòng)畫效果钞脂,你可能需要TickerProviderStateMixin)揣云。
11,Subject和BehaviorSubject
1.Subject類芳肌,Subject可以實(shí)現(xiàn)一個(gè)消息向多個(gè)訂閱者推送消息? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? var subject = new Rx.Subject(); ? //實(shí)例化一個(gè)Subject對(duì)象? ? ? ? ? ? ? ? ? ? ? subject.next(1); ? ? ? ? ? ? ? ? ?//向接受者發(fā)送一個(gè)消息流
subject.subscribe({? ? ? ? next: (value) => console.log('observerA: ' + value) ?//接受者A訂閱消息灵再,獲取消息流中的數(shù)據(jù)});
subject.subscribe({? ? ? ? next: (value) => console.log('observerB: ' + value) ?//接受者B訂閱消息,獲取消息流中的數(shù)據(jù)});
這樣兩路接受者都能拿到發(fā)送的數(shù)據(jù)流:observerA:1observerB:1
2.BehaviorSubject是Subject的一個(gè)衍生類亿笤,它將數(shù)據(jù)流中的最新值推送給接受者
var subject = new Rx.BehaviorSubject(0); //聲明一個(gè)BehaviorSubject對(duì)象subject.next(1); ? ? ? ? ? //發(fā)送一個(gè)數(shù)據(jù)流? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? subject.next(2); ? ? ? ? ? //再發(fā)送一個(gè)數(shù)據(jù)流
subject.subscribe({? ? ? ? next: (v) => console.log('observerA: ' + v) ?//接受者A訂閱消息});
subject.subscribe({? ? ? ? next: (v) => console.log('observerB: ' + v) ?//接受者B訂閱消息});
subject.next(3); ? ?//再發(fā)送一個(gè)數(shù)據(jù)流
這樣翎迁,每次接受者只會(huì)接受最新最送的那個(gè)消息:
observerA:2
observerB:2
observerA:3
observerB:3
12,Sink
使用Sink給Stream添加數(shù)據(jù)
13净薛,Sream
對(duì)于剛接觸Flutter的同學(xué)來說,Stream(流)是一個(gè)相對(duì)比較抽象汪榔,也相對(duì)比較難以理解的東西。準(zhǔn)確的來說Stream并不是Flutter的特性,而是Dart語(yǔ)言自身所帶庫(kù)痴腌。Stream和Future都位于dart:async核心庫(kù)雌团,是Dart中異步操作的兩大高手。所以不僅僅可以用于Flutter,而是可以用于任何Dart語(yǔ)言上的實(shí)現(xiàn)士聪。 在我們剛開始學(xué)習(xí)Flutter的時(shí)候基本都是使用?StatefulWidget和setState((){})來刷新界面的數(shù)據(jù)锦援,當(dāng)我熟練使用流之后就可以基本完全使用StatelessWidget告別?StatefulWidget同樣達(dá)到數(shù)據(jù)刷新效果。
14剥悟,InkWell
Flutter有專門設(shè)計(jì)MaterialDesign風(fēng)格的按鈕灵寺,但是更多時(shí)候我們希望自定義按鈕樣式或者為某個(gè)組件添加點(diǎn)擊事件,所以在處理點(diǎn)擊事件時(shí)区岗,最常見的做法是略板,用InkWell或者GestureDetector將某個(gè)組件包起來。 GestureDetector用法與InkWell類似慈缔,不過GestureDetector有更多處理手勢(shì)的方法