-
Container
添加 padding, margins, borders, background color, 或?qū)⑵渌b飾添加到widget
-
Scaffold
使用Scaffold是最容易的嘁圈,它是 Material Components庫(kù)中的一個(gè)widget,它提供了一個(gè)默認(rèn)banner蟀淮,背景顏色最住,并且具有添加drawer,snack bar和底部sheet的API
-
DefaultTextStyle
DefaultTextStyle.merge可以允許您創(chuàng)建一個(gè)默認(rèn)的文本樣式灭贷,該樣式會(huì)被其所有的子節(jié)點(diǎn)繼承
-
maxCrossAxisExtent
GridView.extent中maxCrossAxisExtent的作用
-
SizedBox
能強(qiáng)制子控件具有特定寬度温学、高度或兩者都有,使子控件設(shè)置的寬高失效
new SizedBox(
width: 100.0,
height: 100.0,
child: Container(
width: 200.0,
height: 200.0,
color: Color(0xffff0000),
),
)
-
State狀態(tài)管理
- 如果狀態(tài)是用戶數(shù)據(jù)略贮,如復(fù)選框的選中狀態(tài)甚疟、滑塊的位置,則該狀態(tài)最好由父widget管理
- 如果所討論的狀態(tài)是有關(guān)界面外觀效果的逃延,例如動(dòng)畫(huà)览妖,那么狀態(tài)最好由widget本身來(lái)管理
- 如果有疑問(wèn),首選是在父widget中管理狀態(tài)
-
flutter的Key
Flutter-->何時(shí)需要使用到key揽祥?
flutter 中的 key
-
flutter的json轉(zhuǎn)為實(shí)體類(lèi)插件(Android Studio插件)
AS中搜索插件FlutterJsonBeanFactory
讽膏,安裝,重啟AS拄丰。
在指定目錄下府树,右鍵,new - dart bean class File From JSON料按,粘貼進(jìn)json奄侠,格式化,生成即可载矿。
-
dart中export使用
在A庫(kù)中使用export關(guān)鍵字引入B庫(kù)垄潮,當(dāng)我們使用A庫(kù)的時(shí)候,會(huì)自動(dòng)引入B庫(kù),也就是說(shuō)我們導(dǎo)入了A庫(kù)弯洗,就可以使用B庫(kù)了旅急。
-
cupertino下push的同時(shí),隱藏tabbar
Navigator.of(context, rootNavigator: true)
.push(CupertinoPageRoute(builder: (BuildContext context) {
return new MsgCenterPage();
}));
-
flutter使用16進(jìn)制色值
Color(0xFFFF8A65)其中0x后面的兩位FF表示透明度16進(jìn)制牡整,F(xiàn)F后面為色值
-
flutter獲取屏幕寬高和狀態(tài)欄高度
/** 獲取屏幕寬度 */
static double getScreenWidth(BuildContext context) {
return MediaQuery.of(context).size.width;
}
/** 獲取屏幕高度 */
static double getScreenHeight(BuildContext context) {
return MediaQuery.of(context).size.height;
}
/** 獲取系統(tǒng)狀態(tài)欄高度 */
static double getSysStatsHeight(BuildContext context) {
return MediaQuery.of(context).padding.top;
}
-
GestureDetector為布局添加手勢(shì)藐吮,child和空白區(qū)域全部可點(diǎn)擊
GestureDetector的child添加為Container,同時(shí)Container要設(shè)置color逃贝,整體Container的child和空白區(qū)域才全部可點(diǎn)擊炎码,否則則是Container的child可點(diǎn)而空白不可點(diǎn)擊。
-
隱藏鍵盤(pán)
FocusScope.of(context).requestFocus(FocusNode());
-
dynamic的使用
在數(shù)據(jù)解析過(guò)程中秋泳,如果不確定當(dāng)前類(lèi)型的話潦闲,可以使用dynamic來(lái)代替,具體是某個(gè)類(lèi)型的話迫皱,再轉(zhuǎn)為某個(gè)類(lèi)型歉闰。
@JsonSerializable()
class ResultData extends Object {
@JsonKey(name: 'code')
String code;
@JsonKey(name: 'data')
dynamic data;
@JsonKey(name: 'url')
String url;
@JsonKey(name: 'message')
String message;
ResultData(this.code,this.data,this.url,this.message,);
factory ResultData.fromJson(Map<String, dynamic> srcJson) => _$ResultDataFromJson(srcJson);
Map<String, dynamic> toJson() => _$ResultDataToJson(this);
}
-
flutter延遲執(zhí)行
new Future.delayed(Duration(seconds: 2), () {
Navigator.of(context).pop();
});
-
flutter中url中編碼解碼
例如:需要將
js://iOSAction?%7B%22method%22:%22toLogin%22%7D
轉(zhuǎn)為
js://iOSAction?{"method":"toLogin"}
使用Uri的decode方法:
String url = Uri.decodeFull(navigation.url);
相反,編碼的話卓起,使用Uri的encode方法和敬。
-
flutter的圖片布局填充滿父布局
方法一:
new ConstrainedBox(
constraints: new BoxConstraints.expand(),
child: new FadeInImage.assetNetwork(
placeholder: "assets/home/placeholder_default.png",
image: model != null
? "${APIConfig.pictureURL}"
"${model.pictureUrl}"
: null,
fit: BoxFit.fill,
),
),
方法二:
如果已知寬高,Image里直接定義指定的寬和高
MediaQuery.of(context).size.width
MediaQuery.of(context).size.height
-
Text超出省略號(hào)截?cái)?/h4>
TextOverflow.ellipsis
new Text(
'我愛(ài)北京天安門(mén)戏阅,我愛(ài)北京天安門(mén)昼弟,我愛(ài)北京天安門(mén),我愛(ài)北京天安門(mén)奕筐,我愛(ài)北京天安門(mén)舱痘,我愛(ài)北京天安門(mén),我愛(ài)北京天安門(mén)',
overflow: TextOverflow.ellipsis,
),
-
list
通過(guò)map
轉(zhuǎn)化的時(shí)候獲取index
list
通過(guò)asMap
轉(zhuǎn)為Map
离赫,然后使用Map.map
獲取index
芭逝。
homeNoticeList
.asMap()
.map((index, model) => MapEntry(
index,
new GestureDetector(
onTap: () {
logPrint(index, message: "我點(diǎn)擊了滾動(dòng)的廣告");
},
child: new Container(
color: ColorConfig.white,
child: new Align(
alignment: Alignment.centerLeft,
child: new Text(
model.title,
style: new TextStyle(fontSize: 14.0),
overflow: TextOverflow.ellipsis,
),
),
),
),
))
.values
.toList();
-
Cookie
管理
網(wǎng)絡(luò)請(qǐng)求使用dio進(jìn)行網(wǎng)絡(luò)請(qǐng)求,可以添加cookiemanager攔截器渊胸,來(lái)對(duì)cookie進(jìn)行自動(dòng)管理旬盯,也可手動(dòng)刪除cookie。
Flutter中添加依賴
dio: ^2.1.7 # 網(wǎng)絡(luò)請(qǐng)求
cookie_jar: ^1.0.0 # cookie管理
dio請(qǐng)求封裝中翎猛,添加攔截器:
// 添加`Cookie`管理
dio.interceptors.add(CookieManager(CookieJar()));
然后在request
的headers
中會(huì)自動(dòng)增加
cookie: SESSION=9d41c3e9-5619-492f-aa92-d85add6b04ed
與iOS
的moya
cookie
不一樣胖翰,一個(gè)是cookie
,一個(gè)是"Set-Cookie"
(header中拼入):
["Set-Cookie":SESSION=9d41c3e9-5619-492f-aa92-d85add6b04ed]
-
Appbar
中使用自定義的返回按鈕
先設(shè)置automaticallyImplyLeading
為false
切厘,然后在leading
中設(shè)置返回按鈕萨咳。
automaticallyImplyLeading: false,
leading: new GestureDetector(
onTap: () {
Navigator.of(context).pop();
},
child: new Image.asset('assets/common/nav_back_arrow.png'),
),
-
設(shè)置appbar高度
appBar: new PreferredSize(
child: appBar,
preferredSize: Size.fromHeight(44),
),
-
使用
webview_flutter
時(shí)執(zhí)行調(diào)用js
的方法:
推薦在onPageFinished
里調(diào)用。
例如:
onPageFinished: (String url) {
print("page finished loading: $url");
setState(() {
isLoading = false;
});
// 如果為項(xiàng)目風(fēng)險(xiǎn)等級(jí)的url迂卢,則執(zhí)行隱藏header的js某弦。
if (widget.url == ContentConfig.projectRiskLevel) {
_controller.future.then((controller) {
controller
.evaluateJavascript('hideHeader();')
.then((result) {});
});
}
}
-
android studio
中使用print
打印桐汤,只能打印出一部分的解決辦法:
導(dǎo)入foundation
庫(kù):
import 'package:flutter/foundation.dart';
使用flutter
里foundation
中的debugPrint
打印即可打印全部。
-
TabBar對(duì)應(yīng)的TabController使用代碼切換tabBar (index從0開(kāi)始):
controller.animateTo(index);
-
flutter富文本RichText使用
-
復(fù)制到粘貼板
import 'package:flutter/services.dart';
static copyToClipboard(final String text) {
if (text == null) return;
Clipboard.setData(new ClipboardData(text: text));
}
-
返回當(dāng)前的時(shí)間戳
static int currentTimeMillis() {
return new DateTime.now().millisecondsSinceEpoch;
}
-
返回文件大小字符串
static const RollupSize_Units = ["GB", "MB", "KB", "B"];
/** 返回文件大小字符串 */
static String getRollupSize(int size) {
int idx = 3;
int r1 = 0;
String result = "";
while (idx >= 0) {
int s1 = size % 1024;
size = size >> 10;
if (size == 0 || idx == 0) {
r1 = (r1 * 100) ~/ 1024;
if (r1 > 0) {
if (r1 >= 10)
result = "$s1.$r1${RollupSize_Units[idx]}";
else
result = "$s1.0$r1${RollupSize_Units[idx]}";
} else
result = s1.toString() + RollupSize_Units[idx];
break;
}
r1 = s1;
idx--;
}
return result;
}
-
flutter調(diào)起撥打電話
import 'package:url_launcher/url_launcher.dart';
Future<void> _launched;
Future<void> _makePhoneCall(String url) async {
if (await canLaunch(url)) {
await launch(url);
} else {
throw 'Could not launch $url';
}
}
// 調(diào)起撥打電話
setState(() {
_launched = _makePhoneCall('tel:18612345678');
});
-
垂直分割線
Container(
height: 40,
child: VerticalDivider(color: Colors.red),
),
-
可取消的定時(shí)任務(wù)
Timer代替Future.