理解 Flutter

[此處應(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):

  1. 很多童鞋在前面教程中下載Flutter SDK后解壓放到了高權(quán)限目錄枪汪,如C:盤(pán)除用戶(hù)目錄之外的其他目錄下涌穆。這里建議一般放在其他盤(pán)或者用戶(hù)目錄下怔昨。
  2. 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
終端中的錯(cuò)誤信息

####### 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沼侣、CenterContainer歉秫、Stack
高級(jí) ListView蛾洛、GridViewTable 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)真。

  1. 放任自流吠各,子組件可以充分發(fā)揮自己的長(zhǎng)度臀突,不受屏幕限制。容易產(chǎn)生越界行為贾漏。
  2. 自私指的是候学,自己受父控件約束,子控件不管磕瓷。
  3. 兒控指的是盒齿,既受父控件約束,在這個(gè)前提下能跟子控件一邊大就一邊大困食,沒(méi)兒子跟才父組件一樣大边翁。
  4. 寬松約束是指下限可以跟上限不同,子組件在中間隨意硕盹,越界不行符匾。
  5. 嚴(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)

  1. 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)行換行墓捻。
  2. UnconstrainedBox和OverflowBox雖然對(duì)子組件無(wú)限制抖仅,但是前者在子組件越界了會(huì)管一下報(bào)錯(cuò),后者不會(huì)管砖第。
  3. FittedBox它有的空間都會(huì)給兒子撤卢,但是兒子不能貪心要天上的月亮(無(wú)窮無(wú)盡),不然什么都沒(méi)有梧兼。
  4. LimitedBox能對(duì)子組件進(jìn)行限制放吩,但是卻需要它的父組件對(duì)它沒(méi)有限制。
  5. 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ù)...

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末喷斋,一起剝皮案震驚了整個(gè)濱河市唁毒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌星爪,老刑警劉巖浆西,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異顽腾,居然都是意外死亡近零,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)抄肖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)久信,“玉大人,你說(shuō)我怎么就攤上這事漓摩∪故浚” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵管毙,是天一觀(guān)的道長(zhǎng)腿椎。 經(jīng)常有香客問(wèn)我,道長(zhǎng)夭咬,這世上最難降的妖魔是什么啃炸? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮卓舵,結(jié)果婚禮上南用,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好训枢,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著忘巧,像睡著了一般恒界。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上砚嘴,一...
    開(kāi)封第一講書(shū)人閱讀 49,079評(píng)論 1 285
  • 那天十酣,我揣著相機(jī)與錄音,去河邊找鬼际长。 笑死耸采,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的工育。 我是一名探鬼主播虾宇,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼如绸!你這毒婦竟也來(lái)了嘱朽?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤怔接,失蹤者是張志新(化名)和其女友劉穎搪泳,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體扼脐,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡岸军,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瓦侮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片艰赞。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖脏榆,靈堂內(nèi)的尸體忽然破棺而出猖毫,到底是詐尸還是另有隱情,我是刑警寧澤须喂,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布吁断,位于F島的核電站,受9級(jí)特大地震影響坞生,放射性物質(zhì)發(fā)生泄漏仔役。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一是己、第九天 我趴在偏房一處隱蔽的房頂上張望又兵。 院中可真熱鬧,春花似錦、人聲如沸沛厨。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)逆皮。三九已至宅粥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間电谣,已是汗流浹背秽梅。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留剿牺,地道東北人企垦。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像晒来,于是被迫代替她去往敵國(guó)和親钞诡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345