1. 三方庫使用:
https://pub.dev/ 這上面有豐富的flutter三方庫及評分
2. 圖片設(shè)置格式問題
assets:
- images/icon_no_data.png
- images/icon_logo_small.png
///如果格式不是這個圖片顯示不出來牛柒,如少空格等;
需要在pubspec.yaml中添加圖片级乐,不需要@2x這種
圖片資源很多的時候不想每張圖片都去聲明呢嫉称,這時候可以只需要聲明文件夾晴圾,這樣就會把文件夾里面所有資源識別到蝇闭,就像這樣:
assets:
- images/
- images/2.0x/
- images/3.0x/
3. 使用FlutterEngine
使用FlutterEngine方式蕴侣,調(diào)用
setInitialRoute
方法會無效泊交,在Flutter端拿到的永遠(yuǎn)是“/”
根目錄符號雁歌,這是Flutter SDK的一個BUG宏浩,因此如果必須依賴 setInitialRoute 參數(shù),那么可以使用直接 new FlutterViewController再使用路由
// 這種 setInitialRoute不生效
func handleButtonAction() {
let flutterEngine = (UIApplication.shared.delegate as? AppDelegate)?.flutterEngine
let flutterViewController = FlutterViewController(engine: flutterEngine, nibName: nil, bundle: nil)!
flutterViewController.setInitialRoute("test1")
self.navigationController?.pushViewController(flutterViewController, animated: true)
}
// new FlutterViewController
@objc func handleButtonAction2(){
let flutterViewController = FlutterViewController()
flutterViewController.setInitialRoute("test1")
self.navigationController?.pushViewController(flutterViewController, animated: true)
}
4. native給flutter交互傳值
setMethodCallHandler result native原生給flutter傳值 json類型的value需要轉(zhuǎn)為string類型
// 路由
func configRoute() {
var initialRoute = Dictionary<String, String>()
initialRoute["pageRoue"] = "order_list_page"
initialRoute["url"] = "t8x"
self.setInitialRoute(initialRoute.ff_toJson())
}
5.熱更新
Only Flutter apps in debug mode can be hot reloaded. 只有==debug==模式下可用
6.debug和release模式
Debug
模式對應(yīng)Dart的JIT
模式靠瞎,該模式會打開所有的斷言(assert)比庄,調(diào)試信息等,并支持Hot reload
(熱重載)乏盐,但是并沒有優(yōu)化代碼執(zhí)行速度佳窑、二進(jìn)制包大小和部署,所以在debug模式下我們會感覺到卡頓父能,不流暢等問題
Release
模式對應(yīng)Dart的 AOT
模式神凑,該模式會關(guān)閉所有斷言,盡可能多的調(diào)試信息。此外還優(yōu)化了應(yīng)用快速啟動溉委,代碼快速執(zhí)行鹃唯,以及二進(jìn)制包的大小,所以在release模式下瓣喊,才是Flutter真正的實(shí)力坡慌,非常流暢。
7. 混編頁面黑屏
iOS和flutter混編加載頁面藻三,iOS需要設(shè)置頁面顏色洪橘,否則會閃黑屏
8.Listview監(jiān)聽滾動狀態(tài)
child: NotificationListener(
onNotification: (notification){
switch (notification.runtimeType){
case ScrollStartNotification:
debugPrint("開始滾動");
break;
case ScrollUpdateNotification:
debugPrint("正在滾動");
break;
case ScrollEndNotification:
debugPrint("結(jié)束滾動");
break;
case OverscrollNotification:
debugPrint("滾動到邊界");
break;
}
},
child: ListView.builder(
),
));
9.熱更新Error -32601 received from application: Method not found
flutter pub cache repair
flutter clean
10. 第一次加載flutter頁面顯示ios啟動圖
需要注意的是iOS原生跳轉(zhuǎn)flutter時,第一次跳轉(zhuǎn)會異步渲染flutter環(huán)境棵帽,因此熄求,F(xiàn)lutterViewController實(shí)例有個splashScreenView屬性,防止用戶在打開flutter頁面時會有一個中間的空檔逗概,如果我們沒有設(shè)置此屬性抡四,iOS默認(rèn)將app應(yīng)用的LaunchStoryboard設(shè)置為此屬性的值,默認(rèn)可能設(shè)置成功也可能設(shè)置失敗仗谆,取決于你APP的啟動圖片是否是用LaunchStoryboard來設(shè)置的指巡,所以,沒有特殊情況隶垮,最好手動設(shè)置一下此屬性藻雪;
11. 混合棧問題
使用馬蜂窩App方案,一個
Native
頁面(ios vc 安卓activity/fregment)對應(yīng)一個flutter
頁面;
問題:在跳轉(zhuǎn)時候狸吞,由于原生導(dǎo)航棧push有動畫效果勉耀,之前使用MaterialPageRoute
路由也有默認(rèn)動畫,導(dǎo)致有兩個動畫
解決:flutter修改路由為PageRouteBuilder
;自定義路由蹋偏,默認(rèn)無動畫效果
在項(xiàng)目中建議使用閑魚團(tuán)隊(duì)出的 flutterboost
框架便斥,非常方便進(jìn)行路由管理及解決混合棧問題。
12威始、iOS風(fēng)格的AppBar
/**
* iOS風(fēng)格導(dǎo)航欄
*
* const CupertinoNavigationBar({
Key key,
this.leading,//導(dǎo)航欄左側(cè)組件
this.automaticallyImplyLeading = true,//是否顯示左邊組件
this.automaticallyImplyMiddle = true,//是否顯示中間組件
this.previousPageTitle,//導(dǎo)航欄左側(cè)組件的右邊的文本
this.middle,////導(dǎo)航欄中間組件
this.trailing,////導(dǎo)航欄右側(cè)組件
this.border = _kDefaultNavBarBorder,//
this.backgroundColor = _kDefaultNavBarBackgroundColor,//背景色
this.padding,//
this.actionsForegroundColor = CupertinoColors.activeBlue,//左側(cè)默認(rèn)組件和左側(cè)組件右邊文本的顏色
this.transitionBetweenRoutes = true,//
this.heroTag = _defaultHeroTag,//transitionBetweenRoutes:false時才能設(shè)置
})
*/
return new Scaffold(
appBar: new CupertinoNavigationBar(
middle: new Text('test'), //title
trailing: Material(child: IconButton(icon: Icon(Icons.settings))), //右側(cè)導(dǎo)航icon
),
body: Text('test'),
13枢纠、TabBarView使用問題
在上下聯(lián)動的結(jié)構(gòu)中,使用到 TabBarView 組件黎棠,該組件切換的時候晋渺,每次都會重新觸發(fā)子組建的initState方法
這時候可以設(shè)置
class OrderListState extends State<OrderListView>
with AutomaticKeepAliveClientMixin{
@override
bool get wantKeepAlive => true;
并且在build方法里面調(diào)用super方法
Widget build(BuildContext context) {
super.build(context);