跳到主要內容

Flutter: win10下 cmd 內 flutter doctor 環境設定問題與必須要知道的開發資源

 


https://github.com/flutter/flutter

對,我最近在學Flutter...因為開發android 後又要開發ios...

然後這過程實在累死人了...我花了一個月開發一個android app,又要花兩個月開發ios,然後ios的設計又需要重新設計... 

人力不足,開發兩個平台後又累,產出的app效果又不好,通常android app強的人, ios app就會弱....

我真的受夠了,一次要開發兩種平台app.在一般公司不大的情況下,花兩倍人力的資源在開發app上實在不划算。

google最近發佈了flutter 2.0 所以我決定花點時間開發看看flutter...他用dart. 跟java有點像.然後也是用android studio ide.

為何不用同一套code與邏輯開發一次程式就好了???

一套code然後7個平台都可run...

這才是聰明人的做法吧.

(試想如果各個平台都要單獨開發,要七組人,研發費用是七倍啊~)

-安裝flutter sdk:

但按照google指示安裝flutter sdk後 , 遇到一連串環境設定問題....
C:\Windows\System32>flutter doctor --android-licenses
Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema
at com.android.repository.api.SchemaModule$SchemaModuleVersion.<init>(SchemaModule.java:156)
at com.android.repository.api.SchemaModule.<init>(SchemaModule.java:75)
at com.android.sdklib.repository.AndroidSdkHandler.<clinit>(AndroidSdkHandler.java:81)
at com.android.sdklib.tool.sdkmanager.SdkManagerCli.main(SdkManagerCli.java:73)
at com.android.sdklib.tool.sdkmanager.SdkManagerCli.main(SdkManagerCli.java:48)
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.annotation.XmlSchema
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:606)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:168)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)


似乎是 OpenJDK 15後 java.se.ee doesn't exist anymore. 所造成...

Java 11/11+, which doesn't have Java EE modules.

Oraclx 又在亂搞...害大家之後安裝軟體都會出問題...買下java後,就一直破壞java的穩定度,移除東移除西,導致用java的人或相關軟體一直出問題.這家公司為了賺錢真是害死大家. 

但是安裝flutter時會強迫大家要安裝jdk/ java sdk才可....無法逃避.

此時,我想暫時先用回舊版jdk試試, 這才發現目前連download舊版jdk8 ,Oracelx公司都要求登入,真是可惡.


連下載個jdk都要求登入,很多人就是不想要登入跟註冊.

Ora公司這樣,會搞到很多惡意軟體特別去偽造jdk,很可能間接造成病毒流行....


修正方法:

先不要用java 15.先裝jdk 8...從openjdk 那下載

設定Path

 

設定完後cmd下執行flutter doctor還是一樣有錯誤訊息,

但是我實際上 android sdk 29與  buildtools 28.0.3都有安裝。..(issue: Flutter does not find android sdk)

所以感覺flutter sdk接連出包。..

先是jdk, 而現在是偵測android sdk出問題....


實際開發app後要換回jdk 15...


 執行flutter doctor更慘,兩個錯....

結論是win10, flutter sdk 在cmd下執行flutter doctor 就是會出問題....

所以先不要管它吧...

改用 android studio 內建的flutter指令列就好了...很奇怪...

所以這個問題就是不要管它了,此時不要要求完美,等日後flutter團隊會再去修正它吧....

只要android studio下flutter doctor沒問題就可以了, 不要管cmd下會出錯的問題, 

先直接開發app吧.

hello world app可以順利build出來.

...

但這樣不對啊... 有錯誤訊息總是不舒服....

 還是再次檢查一下,所有元件:

問題: 發現win10沒安裝最新版PowerShell.... so 我決定來安裝PowerShell 7  at win10最新版



確認版本號: 7.1.2 是最新的(未來可能會進版)

把android studio內建的JRE設定到JAVAHOME

再次執行flutter doctor: 出現 一個x, 一個驚嘆號!

按照指示執行 flutter doctor --android-licenses

同意所有條款yes.... (你不同意就沒法繼續...這是強迫的)

---------------------------------------
Accept? (y/N): y
All SDK package licenses accepted

一直到出現上面訊息.

再次執行 flutter doctor, ---> 而這次licenses 有打勾了,沒出錯了.

 -------

再次: 發現問題點: ANDROID_SDK_ROOT   沒設定!

設定在全域變數,設定好後,要指向android sdk目錄,設定好後 , 記得要重開機.

感覺問題好像是這引起的, 故把JAVA_HOME變數換回java sdk new version: jdk 15  --->記得是設定完~"全域變數"win10一定要重開機才會生效. 

ps: (開發app最好還是用最新的穩定版java sdk)


 

再次執行flutter doctor:


all pass...

這才是解決問題的方式阿...

所以不用裝jdk 8 , 所以也不用怪 oracelx..., flutter 偵測不到正確的android sdk version也不是flutter 的錯...

也不用去設定 set JAVA_OPTS=-XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee

網路上一堆說明是錯誤的.

是我自己忘了設定 ANDROID_SDK_ROOT !!!!

flutter guide document 也沒提到....

所以記得flutter doctor 要全部顯示打勾才算完成flutter 開發環境設定.

(ps: 所以前面提到的安裝open jdk8 這步驟可以省了,也可以移除jdk8..)

現在才開始要設計app...因為flutter環境設定問題延遲了2天


推薦: dart 的教學課程:

https://www.youtube.com/playlist?list=PL274L1n86T83ps4pzbc6cFSpW38jJSdEb



另外:我們知道 flutter 專案被使用在google pay.

google pay評估了各種選項之後,選擇Flutter。  

they selected Flutter is cross-platform and uniform experience.

他們選擇flutter的三個原因是:  

1.可以在Dart中編寫一次,然後在iOS和Android上進行部署,從而在Android和iOS上獲得統一的最佳體驗。  

(Write once in Dart and deploy on both iOS and Android for a uniform best-in-class experience)

2.及時的編譯器在開發過程中具有熱重載功能,可以在UI上進行快速迭代,從而極大地提高了開發人員的效率;  

(Just-in-Time compiler with hot reload feature for increased developer efficiency and faster UI changes)

3.提前編譯可確保高性能部署。(這點改善了與其他類型框架之間比較後的缺點)

(Ahead-of-time compilation ensured high-performance deployment)

既然google 本身這麼大的企業都用了flutter...我們實在沒理由不用. 


對於小企業Flutter有何益處?

How Flutter Is Advantageous To SOHO?

  • 大大減少了應用開發時間(It drastically reduces app development time)
  • 出色的性能和最佳的用戶體驗(Excellent performance and best user experience)
  • 易於整合和強大的社群支持(Ease of integration and great community support)
  • 團隊更快樂,生產力更高(Happier teams and increased productivity)
  • Visually-appealing apps for both iOS and Android platforms
  • Uses Dart language to improve overall performance

目前我正在學習dart 與flutter, 已經快兩週,感覺跟java與原生android app development開發過程很類似.

學習flutter必看的dart語言指南:

https://levelupprogramming.net/dart-language-tutorial-for-programmers-e1ff2c8b7d86

開始設計flutter, 第一個程式,最基本的hello world: StatefulWidget+floatingActionButton

不需手機,網頁也可以跑.


用Flutter可以做出許多漂亮的介面,像下圖:

 


 

留言

這個網誌中的熱門文章

最爛的銀行服務-玉山銀行

今天寫信給玉山銀行,問他說能不能給予我免費跨行轉帳次數, 我是他們大客戶....常常需要轉帳跟提款.發現這樣被扣手續費很不划算. 玉山銀行的atm又很少見. 但是得到的回應是這樣: 看完這信,有回答等於沒回答,當下我就決定要轉到其他家銀行了, 只是有點麻煩,股票帳戶,外幣帳戶,黃金存摺帳戶... 玉山銀行在我家附近連一台提款機都沒有,每次都要借台新銀行或中信銀行的atm. 把錢放在這裡實在不方便,不斷被扣轉帳手續費跟提款手續費. 你看台新銀行richard給我五次免費額度. 使用其他家例如合作金庫與兆豐銀行都有台灣pay可以免手續費. 玉山銀行???? 今天開始要開始廢棄玉山銀行了.... 而且看這回信後,我也覺得玉山銀行很爛,自己不建atm,又不給客戶免費跨行提款次數,叫我跑大老遠自己搜尋ATM. 建議大家他的股票: 玉山 金控 ( 2884 ) 也不要買, 股價一定會慢慢下跌的,看他們家的服務讓客戶一個一個跑掉,就知道了 . 未來不是有很多純網銀出來嗎? 他們都會給予更多免費跨行轉帳次數. 感覺未來這種服務不佳的銀行都準備被淘汰吧. 對於app設計師來說: 這種回答也是最不佳的. 我們要對user友善點,使用者反應app會當機,有問題時, 回答要能解決他們的問題. 千萬不能像玉山銀行客服人員這樣回答. 使用者都是很厲害的,他發現你沒鳥他,明天開始就刪除app了. PS:後來去辦了兆豐銀行.行員說只要辦個數位帳戶就有10次跨行提款...而且已經有一般非數位帳戶也可再申請一個數位的. 相比玉山銀行還限制如果有玉山帳戶者再申請數位帳號也沒有跨行轉帳提款優惠,玉山真的好差... 除此之外,台新銀行也給我各5次免費跨行轉帳+提款次數 真的好好..(以上都不用薪轉戶,一般人都有資格可以申請) 有了15次轉帳跟跨行提款免費,就不用到處找ATM.... 心情好多了,現在欠缺的就是錢了

app bundle and bundletool. 關於aab安裝問題

google 有說明年開始強制使用app bundle. 不然不准更新app. 但是產出的apk不再是apk了,而是aab. C:\release>adb install 6.aab Performing Streamed Install adb.exe: filename doesn't end .apk or .apex: 6.aab   不能透過adb install.... so, google 發表一個新tool: 去download bundletool...因為是java跨平台都可執行. https://github.com/google/bundletool/releases   You can extract the apks files from the aab file using the bundletool command. https://developer.android.com/studio/command-line/bundletool To generate an APK set for all device configurations (signed with a debug key) you can use:  bundletool build-apks --bundle=/MyApp/my_app.aab --output=/MyApp/my_app.apks To deploy your app from an APK set, use the install-apks  bundletool install-apks --apks=/MyApp/my_app.apks test:   C:\release>java -jar bundletool.jar build-apks --bundle=6.aab --output=out_6.apks INFO: The APKs will be signed with the debug keystore found at 'C:\Users\mark\.android\debug.keystore'.   還是失敗,還要指定key才可以...  For Release apk command, example 1: bundle

ios app 上架時app icon要注意事項

按照apple ios app icon標準(App Icon Attributes): All app icons should adhere to the following specifications. 所有app icon須符合下列: -Format: PNG  , 一定要png...但全彩png size很大 .. -Color: 注意24bit不要有透明色在上面. -Layers: Flattened with no transparency. 絕不可以有alpha透明色. -Shape Square with no rounded corners 不可以有圓角,之後apple會統一用圓角特效上去. -Resolution: -iPhone X, iPhone 8 Plus, iPhone 7 Plus, and iPhone 6s Plus @3x -All other high-resolution iOS devices @2x ps: 建議不要使用 PDF 檔案.. pdf內是一個向量圖,本來是用來減少png的size太大問題. 但對於較複雜的圖像而言 PNG 的表現實際上是優於 PDF 的. iOS系統會自動把 30x30 的 PDF 圖檔做成 @2x 60x60 的 PNG 圖檔. 很複雜的官方說明: Image Size (px) File Name Used For App Store 512x512 iTunesArtwork App list in iTunes Do not include 1024x1024 iTunesArtwork@2x App list in iTunes on devices with retina display Do not include 120x120 (最重要!) Icon-60@2x.png Home screen on iPhone/iPod Touch with retina displ

SMR疊瓦式hdd致命缺陷被解決????!!!

新聞來源: https://tech.sina.cn/2019-12-25/detail-iihnzahi9980174.d.html 現在90%所有的硬碟 … 除了SSD 之外都是採用PMR 技術,但為容量增長而發展的SMR( 疊瓦式磁紀錄)會比較便宜不要踩地雷 。 PMR、SMR 硬碟分別是什麼? PMR (perpendicular magnetic recording,垂直磁性記錄). 寫入磁頭會比讀取磁頭來得大,因此硬碟供應商若要增加磁錄密度,就會儘可能讓寫入磁頭的尺寸縮小至物理極限為止。 SMR (shingled magnetic recording,疊瓦式磁性記錄). SMR 採用的技術是讓資料循序寫入,如其名稱所示,磁軌會如瓦片般堆疊在另一磁軌的部分面積上,藉此達到增加磁錄密度的目的。在此情況下,讀取磁頭仍可從磁軌上未被覆蓋的部分來讀取資料。   玩家對SMRHDD避之唯恐不及,因為這種HDD性能、可靠性都有問題,但它能提升HDD存儲密度大約1/4 PMR 與 SMR 的差異 當 SMR 硬碟上循序寫入新資料時,這些如瓦片般堆疊的磁軌仍可正常讀取, 並不影響讀取效能。 不過,一旦已寫入的資料要修改或覆寫時,寫入磁頭並不會直接在既有的磁軌上進行磁錄,以避免毀損相鄰的磁軌。 編輯後的資料會先在磁碟上的空白處寫入,原先舊資料的磁軌會暫時維持不動。 等到硬碟閒置時才會進行重新整理的機制,將原先磁軌上的舊資料自動清除,並重新成為可用空間以供新資料寫入。 就前述的重新整理機制而言, SMR 硬碟的閒置時間就顯得相當重要。如果 SMR 硬碟長時間進行密集的覆寫任務,則會沒有足夠的閒置時間來重新整理磁軌,暫時不動的既有資料磁軌數量會越來越多。接著導致 SMR 硬碟必須一邊寫入新資料,一邊重新整理舊磁軌,進而對讀寫效能造成某種程度的影響。 WD他們開發了名為Zonefs的文件系統,有望解決SMR HDD寫入數據時的弊端,同時也適用於SSD。 WD近年來一直在研究分區存儲(Zoned Storage),它將 HDD的LBA空間分成多個區塊,只能從每個區塊的開頭順序寫入數據,而且數據不能任意覆蓋。這種數據存儲技術可以改變SMR、SSD HDD存儲、寫入數據的方式,不會再像現在這樣有很多隨機

更改google drive預設存放目錄位置Change Google Drive Default Folder Location in Windows

Google drive預設存放位置是放在C:\Users\username\Google 雲端硬碟.有些人c槽是ssd,空間有限.如果一不小心,像google drive空間有1TB的人. SSD就被塞爆...需要改放在其他磁碟機..(例如c是ssd, D是一般硬碟..可能有幾TB) 1.如果之前已經安裝的人,首先先解除帳戶連結.解除後再刪除掉目前的舊的Google Drive 目錄.釋放已占空間.(不用擔心,因為已經備份到雲端,待會會自動再下載回來.) 2.再次登入帳戶,在最後一頁時.不要那麼快按確認,這裡有個"進階設定". 3.這邊可更改預設資料夾...我們把他改到D槽...或其他槽. 建一個新目錄,取個好記的名字,例如"[GoogleDrive]",加上特殊字元"[" "]"可讓資料夾排在最前面,將來比較好找.更改好之後,再選擇這新資料夾.   PS: 也建議大家不要把Google drive預設資料夾放在C:\Users\username\Google 雲端硬碟. 一則不方便找.二則重灌電腦時,會忘記這邊有資料,整理起來很麻煩.三是C通常是SSD,容量小,設在D槽(如果是HDD的話),可避免塞爆SSD.