[此處應(yīng)該有一張圖]
本文均依據(jù)于flutter官方文檔流程示弓,只梳理其中的坑點(diǎn)狡门。
使用方法:由于本文可能會(huì)較長(zhǎng)娃磺,知識(shí)點(diǎn)零散嗜价,請(qǐng)讀者善用Ctrl+F
田度。
基于Flutter2.0
Windows+VS Code向
請(qǐng)注意:本文 不是教程內(nèi)容湾宙,章節(jié)名與flutter官方文檔對(duì)應(yīng)章節(jié)一致樟氢,只用于備查和幫助學(xué)習(xí)中遇到問(wèn)題的童鞋,歡迎指正侠鳄。
開(kāi)始使用Flutter
安裝和環(huán)境配置
系統(tǒng)選擇:Windows
獲取 Flutter SDK
從教程中的鏈接下載最新的stable安裝包埠啃,建議解壓到其他盤(pán)或者用戶(hù)路徑下。然后win+s
輸入env添加flutter的bin路徑到環(huán)境變量中伟恶。
這里就有一個(gè)問(wèn)題碴开,修改環(huán)境變量后,需要使用環(huán)境變量的進(jìn)程(如:ternimal,cmd潦牛,vscode等)都需要重啟眶掌,保證進(jìn)程內(nèi)環(huán)境變量被封信。
知識(shí)點(diǎn):系統(tǒng)環(huán)境變量只會(huì)在啟動(dòng)進(jìn)程時(shí)注入進(jìn)程巴碗,由一個(gè)進(jìn)程向啟動(dòng)的另外一個(gè)進(jìn)程注入朴爬。
運(yùn)行 flutter doctor
flutter doctor檢查flutter相關(guān)環(huán)境是否可用,按照你的需要來(lái)判斷橡淆,如果紅叉部分和你要用的無(wú)關(guān)召噩,那么忽略它就是。如你想要用VS Code做Web開(kāi)發(fā)逸爵,你只需要關(guān)注Flutter蚣常、瀏覽器和VS Code是不是勾,其他的叉叉對(duì)你沒(méi)有任何影響痊银。
檢查結(jié)果里如果Android toolchain是叉叉,你又不想裝Android Studio施绎,那么自己安裝Android SDK和Java就可以了溯革。如果你安裝了VS,那么用VS Installer安裝xmarin相關(guān)的安卓SDK谷醉、虛擬機(jī)致稀、JDK等組件就可以搞定。
請(qǐng)注意俱尼,F(xiàn)lutter教程中提供的Google USB Driver下載鏈接只是一個(gè)公版驅(qū)動(dòng)抖单,很多國(guó)產(chǎn)手機(jī)不一定能夠適配,請(qǐng)自行安裝手機(jī)廠(chǎng)商自己提供的驅(qū)動(dòng)遇八。如果廠(chǎng)商沒(méi)有提供驅(qū)動(dòng)或者下載安裝之后仍然檢測(cè)不到矛绘,不用擔(dān)心,在安裝好Android SDK后刃永,在A(yíng)ndroid SDK管理器里安裝附加程序中Google USB Driver己可货矮。
提示:如果你安裝了Microfost Edge,檢查結(jié)果中Chrome是叉叉也沒(méi)關(guān)系斯够,F(xiàn)lutter能夠識(shí)別Edge囚玫。
編譯工具設(shè)定
本教程選擇:Visual Studio Code
注意點(diǎn),一定要按照教程安裝插件后重啟VS Code读规。然后抓督,按快捷鍵 Ctrul + `
打開(kāi)終端,鍵入Flutter命令是否能找到束亏。
這里就有一個(gè)問(wèn)題铃在,VS Code終端可能會(huì)提示Flutter命名無(wú)效。原因有以下幾點(diǎn):
- 很多童鞋在前面教程中下載Flutter SDK后解壓放到了高權(quán)限目錄枪汪,如C:盤(pán)除用戶(hù)目錄之外的其他目錄下涌穆。這里建議一般放在其他盤(pán)或者用戶(hù)目錄下怔昨。
- VS Code在設(shè)置Flutter的環(huán)境變量前就已經(jīng)啟動(dòng),或者啟動(dòng)VS Code的資源管理器/啟動(dòng)器就已經(jīng)打開(kāi)宿稀。所以趁舀,喜歡使用啟動(dòng)器的小伙伴注意了:
如果啟動(dòng)器沒(méi)有重啟過(guò),那么它的環(huán)境變量中必然是沒(méi)有FlutterSDK的Path的祝沸。請(qǐng)使用開(kāi)始菜單或桌面圖表重啟VS Code矮烹,或者重啟啟動(dòng)器再啟動(dòng)VS Code,不必像網(wǎng)上那些教程那樣重啟電腦罩锐。
開(kāi)發(fā)體驗(yàn)初探
這個(gè)環(huán)節(jié)講如何創(chuàng)建應(yīng)用和編譯運(yùn)行應(yīng)用奉狈。
注意涩惑,即使裝了插件仁期,在VS Code的
Ctrl+Shift+P
中也沒(méi)有全部命令,只有一些常規(guī)的竭恬。
在官方后續(xù)的教程中跛蛋,可能是因?yàn)榻坛滩皇怯蓡我蝗藛T寫(xiě)就,同樣的操作可能在不同的地方介紹的方式會(huì)不統(tǒng)一痊硕。所以赊级,作為程序員,應(yīng)該學(xué)會(huì)全部使用終端輸入命令的方式岔绸。本文都是采用終端命令來(lái)講述操作
前提一:要?jiǎng)?chuàng)建Windows桌面應(yīng)用嗎理逊?
官方教程鏈接:Flutter 桌面支持
在Flutter2.0版本中,桌面應(yīng)用還是處于beta版本中盒揉,幸運(yùn)的是stable版本包含了一份Beta版本的快照晋被,如果你需要嘗試Windows桌面應(yīng)用,那么你需要在終端中執(zhí)行如下命令:
// 啟動(dòng)windows桌面支持
PS >flutter config --enable-windows-desktop
// 檢查Windows的狀態(tài)
PS >flutter devices
// 檢查Windows開(kāi)發(fā)相關(guān)有沒(méi)有安裝
PS >flutter doctor
前提二:在國(guó)內(nèi)開(kāi)發(fā)嗎预烙?請(qǐng)?jiān)O(shè)置鏡像站的環(huán)境變量
官方教程:在中國(guó)網(wǎng)絡(luò)環(huán)境下使用 Flutter
因?yàn)樵趪?guó)內(nèi)訪(fǎng)問(wèn)速度很慢或者有的地區(qū)的童鞋根本就不能訪(fǎng)問(wèn)官方的包管理墨微,而在創(chuàng)建應(yīng)用的時(shí)候,會(huì)去包管理服務(wù)器下載一些依賴(lài)包扁掸,就會(huì)出現(xiàn)400系列錯(cuò)誤或者500系列錯(cuò)誤(因?yàn)榫W(wǎng)絡(luò)原因翘县,官方的服務(wù)器會(huì)隨時(shí)掛掉)
注意:官方給出了好多個(gè)鏡像地址,經(jīng)過(guò)使用后谴分,推薦CNNIC锈麸,或Flutter社區(qū),發(fā)現(xiàn)清華的不是太穩(wěn)定牺蹄,上海交大的十分不穩(wěn)定忘伞。具體鏡像情況查看這個(gè)網(wǎng)址:Flutter 鏡像狀態(tài)檢測(cè) (uptimerobot.com)
官方教程中沒(méi)有windows平臺(tái)設(shè)置方法,開(kāi)發(fā)windows的童鞋下按照以下步驟設(shè)置:
1. win+s 搜索env打開(kāi)環(huán)境變量
2. 在系統(tǒng)變量中`新建`輸入PUB的環(huán)境變量。如:變量名:```PUB_HOSTED_URL``` 氓奈,變量值:```http://mirrors.cnnic.cn/dart-pub```
3. 和FLUTTER的翘魄,如:變量名:```FLUTTER_STORAGE_BASE_URL```,變量值:```http://mirrors.cnnic.cn/flutter```
4. 保存后重啟VS Code舀奶,注意前文的環(huán)境變量注入原理
創(chuàng)建應(yīng)用
// 簡(jiǎn)單寫(xiě)法
PS >flutter create yourappname
// 復(fù)雜寫(xiě)法
PS >flutter create --template app --platforms linux,windows,android --project-name yourappname .\YourAppProjectFolderName\
// 為已有的應(yīng)用添加桌面支持(多個(gè)平臺(tái)名稱(chēng)用英文逗號(hào)隔開(kāi)暑竟,如:windows,linux,maos)
// *** 最后的`點(diǎn)`很重要,是當(dāng)前應(yīng)用目錄的意思育勺,別忘了 ***
PS >flutter create --platforms=windows .
注意:項(xiàng)目名稱(chēng)一定但荤!一定!一定涧至!不能有大寫(xiě)腹躁,單詞之間想隔開(kāi)用
_
,dart不允許項(xiàng)目名稱(chēng)有大寫(xiě)南蓬。但是纺非,文件夾名字可以隨便寫(xiě)大小寫(xiě)??
運(yùn)行應(yīng)用
// 運(yùn)行當(dāng)前app的命令,會(huì)自動(dòng)按照當(dāng)前選定的設(shè)備進(jìn)行編譯赘方。-v 參數(shù)是打印詳細(xì)日志
PS >flutter run -v
如果是要開(kāi)發(fā)安卓APP的小童鞋铐炫,要注意了。
####### 1. Gradle生成工具
咱們安卓的Gradle生成工具要訪(fǎng)問(wèn)國(guó)外的鏈接蒜焊,不然編譯就會(huì)出現(xiàn)各種報(bào)錯(cuò)問(wèn)題,如卡在Gradle task assembleDebug
科贬。遇到這個(gè)問(wèn)題泳梆,可能需要替換成國(guó)內(nèi)的包源。
這里只介紹項(xiàng)目?jī)?nèi)的更換Gradle包源的辦法榜掌,全局更換方法請(qǐng)google就是优妙。
找到項(xiàng)目中的:\android\build.gradle 這個(gè)文件,對(duì)照如下代碼修改
buildscript {
ext.kotlin_version = '1.3.50'
repositories {
//google()
//jcenter()
// 下面兩句是阿里包源
maven { url 'https://maven.aliyun.com/repository/google/' }
maven { url 'https://maven.aliyun.com/repository/jcenter/'}
}
dependencies {
classpath 'com.android.tools.build:gradle:4.1.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
allprojects {
repositories {
//google()
//jcenter()
// 下面兩句是阿里包源
maven { url 'https://maven.aliyun.com/repository/google/' }
maven { url 'https://maven.aliyun.com/repository/jcenter/'}
}
}
####### 2. JDK版本之謎
咱們的Flutter兼容的JDK版本是個(gè)謎憎账,編譯會(huì)報(bào)各種錯(cuò)誤套硼,網(wǎng)上有人說(shuō)是只兼容JDK8,更為新的版本有問(wèn)題胞皱。JDK有幾個(gè)下載渠道邪意,在Oracle下載的應(yīng)該沒(méi)有問(wèn)題。
強(qiáng)烈建議不要反砌!不要雾鬼!不要在OpenJDK這個(gè)Oracle的換皮網(wǎng)站下載,我下的所有的二進(jìn)制壓縮包發(fā)現(xiàn)都不全宴树,最后上微軟官網(wǎng)下了一個(gè)策菜,配置環(huán)境變量(記得要重啟vs code)后正常使用,就是版本號(hào)奇奇怪怪的。
20201/04/09熱點(diǎn)更新:伴隨著微軟在Google和甲骨文的Java專(zhuān)利官司中勝訴又憨,微軟立馬發(fā)布自己的OpenJDK——Microsoft Build of OpenJDK翠霍,以后可以到微軟官網(wǎng)下載JDK。
####### 3. 編譯出錯(cuò)怎么查看更多信息
安卓采用Gradle進(jìn)行構(gòu)建蠢莺,所以當(dāng)出錯(cuò)后我們自然使用Gradle查看更多信息寒匙,那么Gradle在哪里呢?
// 在你的項(xiàng)目路徑下的這里
./android/gradlew
知道它在哪里浪秘,終端中錯(cuò)誤的相關(guān)建議就知道怎么做了蒋情。下圖里的* Try:
后面的內(nèi)容是指的Gradle而言,所以我們就能通過(guò)這樣的命令查看調(diào)用堆棧信息:
PS >./android/gradlew compileDebug --stacktrace -info
####### 4. 常見(jiàn)問(wèn)題:
1. 'Finished with error: Gradle task assembleDebug failed with exit code 1'
出現(xiàn)這個(gè)報(bào)錯(cuò)要檢查下JAVA的環(huán)境變量設(shè)置是否正確耸携,VS Code有沒(méi)有重啟棵癣。
2. `javax.net.ssl.SSLException`
出現(xiàn)這個(gè)異常一般是JDK版本不兼容,更換為Flutter兼容SDK即可夺衍。
3. `Gradle "Could not open buildscript class cache"`
出現(xiàn)這個(gè)報(bào)錯(cuò)一般關(guān)閉VS Code狈谊,刪除C盤(pán)用戶(hù)目錄下.gradle下caches文件夾。還不能解決有可能是JDK版本不兼容沟沙,更換為Flutter兼容SDK即可河劝。
4. 出現(xiàn)運(yùn)行錯(cuò)誤,打印日志中提示需要 Android SDK Build tools 的某個(gè)版本
出現(xiàn)這個(gè)問(wèn)題矛紫,打開(kāi)Andorid SDK管理工具赎瞎,勾選下載Android SDK Build tools下的對(duì)應(yīng)版本即可
開(kāi)發(fā)文檔
用戶(hù)界面
Widgets介紹
這個(gè)章節(jié)介紹,F(xiàn)lutter中一切UI元素都是Widget(組件)颊咬,這是個(gè)基類(lèi)务甥。所以就肯定有繼承于基類(lèi)的通用的基礎(chǔ)組件,和由基礎(chǔ)組件組成應(yīng)用于不同場(chǎng)景的高級(jí)組件喳篇,也肯定可以自己編寫(xiě)組件類(lèi)敞临。雖然邏輯抽象反而會(huì)增加代碼復(fù)雜度,面向?qū)ο螅ㄔ诿嫦騏I對(duì)象上)真的是的好工具麸澜。
其中挺尿,我覺(jué)得傳達(dá)出一個(gè)很重要的概念:組件和狀態(tài)分離。
如果熟悉MVVM模式(vue.js炊邦、WPF)的童鞋一定很熟悉UI與數(shù)據(jù)分離的模式编矾,通過(guò)更新數(shù)據(jù)就可以達(dá)到更新UI的效果。而Flutter采用的是另外一套MVU模式馁害,我個(gè)人感覺(jué)是腳本+閉包
的嵌套寫(xiě)法洽沟。
初次接觸這種寫(xiě)法剛開(kāi)始肯定會(huì)被搞蒙:代碼和數(shù)據(jù)混雜、作用域混亂蜗细、又臭又長(zhǎng)裆操,代碼層級(jí)巨深怒详,閱讀體驗(yàn)極差等。但是踪区,它也有它的好處昆烁,就是一致性強(qiáng)。數(shù)據(jù)和UI在一起缎岗,清晰的代碼走向静尼。所以,在一開(kāi)始學(xué)習(xí)的時(shí)候传泊,就要做好使用好面向?qū)ο筮@個(gè)工具鼠渺,將可以抽離的模塊形成類(lèi)、方法眷细、對(duì)象等拦盹。而,代碼的簡(jiǎn)潔和性能之道也是需要在后續(xù)的使用過(guò)程中持續(xù)提高的溪椎,可能在使用了flutter幾年之后普舆,你仍然能提升寫(xiě)法使你的代碼更加優(yōu)雅。
布局構(gòu)建
Fluter中的布局
筆者認(rèn)為的布局組件結(jié)構(gòu)表如下:
級(jí)別 | 標(biāo)準(zhǔn) widgets | Material widgets |
---|---|---|
基礎(chǔ) | Row校读、Column沼侣、Center、Container歉秫、Stack | |
高級(jí) | ListView蛾洛、GridView、Table | Card雁芙、ListTile雅潭、DataTable |
####### 1. 布局要點(diǎn)
第一,常規(guī)布局使用基礎(chǔ)基別的標(biāo)準(zhǔn)widgets即可却特,平面布局Row、Colume互相嵌套再加上Container筛圆,Container就是一個(gè)常見(jiàn)UI框架的容器大集合裂明,和div很像。層次布局使用Stack嵌套太援。
第二闽晦,在一些局部的復(fù)雜數(shù)據(jù)呈現(xiàn)、批量同類(lèi)數(shù)據(jù)和特定局部布局中使用高級(jí)的布局組件可以簡(jiǎn)化布局工作提岔。
最后仙蛉,因?yàn)镸VU的代碼編寫(xiě)方式是高度嵌套的結(jié)構(gòu),為了最大限度地減少嵌套深入產(chǎn)生的代碼閱讀體驗(yàn)差碱蒙,可以在變量和函數(shù)中實(shí)現(xiàn) UI 的各個(gè)部分荠瘪。
布局約束[新增]
總結(jié)起來(lái)就是:
子組件的成長(zhǎng)空間由父組件決定夯巷,而父組件和現(xiàn)實(shí)世界相同則有兩種:放任自流和進(jìn)行約束,放任自流又分為自私和兒控哀墓,約束又分為寬松約束和嚴(yán)格約束趁餐。
注:這里是胡亂分類(lèi)取名,搏君一笑爾篮绰,會(huì)意即可后雷,切勿認(rèn)真。
- 放任自流吠各,子組件可以充分發(fā)揮自己的長(zhǎng)度臀突,不受屏幕限制。容易產(chǎn)生越界行為贾漏。
- 自私指的是候学,自己受父控件約束,子控件不管磕瓷。
- 兒控指的是盒齿,既受父控件約束,在這個(gè)前提下能跟子控件一邊大就一邊大困食,沒(méi)兒子跟才父組件一樣大边翁。
- 寬松約束是指下限可以跟上限不同,子組件在中間隨意硕盹,越界不行符匾。
- 嚴(yán)格約束是指下限和上限一致,子組件必須和父組件的約束一樣大瘩例。
So啊胶,常見(jiàn)組件的約束分類(lèi)如下:
父組件類(lèi)型 | 約束類(lèi)型 | 組件 |
---|---|---|
放任自流 | 自私 | Row、Column垛贤、UnconstrainedBox焰坪、OverflowBox |
兒控 | Container、FittedBox | |
約束 | 寬松約束 | Center聘惦、Align某饰、ConstrainedBox、LimitedBox善绎、Flexible黔漂、Scaffold |
嚴(yán)格約束 | App、Expanded禀酱、SizedBox.expand() |
####### 容易忽略的點(diǎn)
- Row不會(huì)對(duì)子組件有任何約束炬守,所以在Row中直接放置Text,Text接收不到任何約束剂跟。在文本過(guò)長(zhǎng)的情況下减途,會(huì)直接超出屏幕酣藻。為了能實(shí)現(xiàn)文本自動(dòng)換行的效果,需要給Text加上Expanded观蜗,因?yàn)镋xpanded的寬度為自動(dòng)填充計(jì)算出來(lái)的臊恋,由它來(lái)傳遞約束給Text,Text就能根據(jù)約束來(lái)進(jìn)行換行墓捻。
- UnconstrainedBox和OverflowBox雖然對(duì)子組件無(wú)限制抖仅,但是前者在子組件越界了會(huì)管一下報(bào)錯(cuò),后者不會(huì)管砖第。
- FittedBox它有的空間都會(huì)給兒子撤卢,但是兒子不能貪心要天上的月亮(無(wú)窮無(wú)盡),不然什么都沒(méi)有梧兼。
- LimitedBox能對(duì)子組件進(jìn)行限制放吩,但是卻需要它的父組件對(duì)它沒(méi)有限制。
- Flexible和Expanded都會(huì)忽略其子控件的寬度羽杰,而Flexible只是會(huì)讓瘦弱的孩子得到剛適合它的大小渡紫。
添加互動(dòng)
互動(dòng)中最核心的還是狀態(tài)的問(wèn)題,Widget分為無(wú)狀態(tài)和有狀態(tài)的考赛。無(wú)狀態(tài)的組件意味著數(shù)據(jù)無(wú)關(guān)惕澎,創(chuàng)建后就UI一直不變到生命消亡。有狀態(tài)組件有著狀態(tài)(數(shù)據(jù))颜骤,在生命周期內(nèi)數(shù)據(jù)會(huì)發(fā)生變化而影響到UI變化唧喉。
看著這種區(qū)別涇渭分明,實(shí)則不用過(guò)多區(qū)別忍抽。其實(shí)它是一個(gè)層級(jí)關(guān)系八孝,最基礎(chǔ)的組件都是無(wú)狀態(tài)的,有狀態(tài)的組件只是由無(wú)狀態(tài)組件組合成了一個(gè)能單獨(dú)支撐某一特定類(lèi)型業(yè)務(wù)數(shù)據(jù)呈現(xiàn)的層面鸠项。實(shí)際上它的狀態(tài)更新導(dǎo)致的UI更新干跛,也是對(duì)子無(wú)狀態(tài)組件的一次銷(xiāo)毀到重新構(gòu)建的過(guò)程。
而互動(dòng)中的狀態(tài)管理的意思是祟绊,對(duì)于有狀態(tài)的組件應(yīng)該怎么樣管理狀態(tài)楼入。總結(jié)一句話(huà)就是:
業(yè)務(wù)狀態(tài)業(yè)務(wù)控件管久免,界面狀態(tài)自己管。和人相關(guān)父親管扭弧,自身狀態(tài)自己管阎姥。
其實(shí),熟悉MVVM的童鞋這個(gè)就很好理解鸽捻,狀態(tài)對(duì)應(yīng)ViewModel呼巴,我們會(huì)在Control和View層級(jí)對(duì)應(yīng)相應(yīng)的ViewModel泽腮。而控件自身的顯示狀態(tài)、動(dòng)畫(huà)衣赶、效果等均由控件自身(也就是樣式)自己來(lái)維護(hù)诊赊。體現(xiàn)的就是一個(gè)作用域思想,也可以理解成層級(jí)關(guān)系府瞄。讓合適的層級(jí)干它能干的事情就行碧磅,不去可以擴(kuò)大狀態(tài)管轄范圍也不縮小狀態(tài)范圍還得進(jìn)行狀態(tài)同步。
這里介紹一個(gè)我認(rèn)為的設(shè)計(jì)原則:
能做無(wú)狀態(tài)的Widget就做成無(wú)狀態(tài)遵馆,減少狀態(tài)管理的位置鲸郊,進(jìn)而減少狀態(tài)耦合和代碼復(fù)雜度,增加狀態(tài)的聚合度货邓。通過(guò)父Widget狀態(tài)更新讓Flutter重新構(gòu)建這個(gè)無(wú)狀態(tài)Widget達(dá)到更新界面的目的秆撮。
Windows窗口美化
一般來(lái)說(shuō),任何一個(gè)桌面商業(yè)軟件换况,都必然是要將默認(rèn)系統(tǒng)窗口的窗體去掉职辨,自己進(jìn)行修飾的。修飾內(nèi)容就主要包括:標(biāo)題欄戈二,三金剛鍵舒裤,標(biāo)題拖動(dòng),窗體大小挽拂,窗體位置惭每,邊框和陰影,窗體背景亏栈。
一般對(duì)于win32程序員來(lái)說(shuō)台腥,這根本不是一個(gè)問(wèn)題,因?yàn)樗麄儠?huì)自己對(duì)flutter項(xiàng)目中的windows文件夾中的win32代碼進(jìn)行修改绒北,實(shí)現(xiàn)他們想要的任何窗體效果黎侈。但是對(duì)于不熟悉win32的程序員來(lái)說(shuō),這就是一件特別難受的事情了闷游。
很遺憾峻汉,直至2021/04/21,windows的CSD(Client-Side Decoration)支持還未得到官方支持脐往,有興趣的可以去這個(gè)issue了解信息Desktop Client Side Decoration support · Issue #31373休吠。
其中就包含一個(gè)解決方案,是一個(gè)開(kāi)發(fā)者也是遇到需要美化窗體時(shí)业簿,看到這條issue就自己動(dòng)手實(shí)現(xiàn)了一個(gè)庫(kù)來(lái)解決這個(gè)問(wèn)題瘤礁。pub鏈接:bitsdojo_window,感謝他的付出梅尤。
同時(shí)柜思,開(kāi)發(fā)者還貼心的錄制了視頻放在某Y屏蔽網(wǎng)站上岩调,B站的搬運(yùn)在此:Flutter desktop - 自定義窗口標(biāo)題欄包含Windows窗體的最大化最小化和關(guān)閉按鈕
這里需要注意:因?yàn)镕lutter對(duì)于各個(gè)平臺(tái)的runner實(shí)現(xiàn)均放在對(duì)應(yīng)平臺(tái)的文件夾下,windows文件下就有對(duì)應(yīng)源代碼windows窗體相關(guān)的win32窗口和dart的封裝赡盘,但是經(jīng)過(guò)一番研究和修改后發(fā)現(xiàn)它的主要結(jié)構(gòu)還是為
主窗口+flutter子窗口
号枕,他們都不是layer層。主窗口為進(jìn)程的啟動(dòng)窗口陨享,子窗口用于放置flutter的app內(nèi)容葱淳。可通過(guò)修改實(shí)現(xiàn)移除默認(rèn)windows窗口霉咨,增加頂部拖動(dòng)蛙紫,增加按鈕,增加陰影等一系列功能途戒,但是不能增加背景透明度達(dá)到類(lèi)似win7的毛玻璃效果坑傅。所以要實(shí)現(xiàn)背景透明類(lèi)似的效果需要等待官方的實(shí)現(xiàn)。
未完待續(xù)...