快速遇到最近用 Flutter 開發 Windows App 上遇到的事情。
話說打開 Wakatime 的紀錄一看,最近好像整個人都變成 Windows 的樣子了呢。
Web View:現在要用 Flutter 開發 Windows app,想要在 app 裡頭有個 web view,可以選擇 webview_windows 這個 package,裡頭用的是微軟的 WebView 2 元件。
我自己還沒有試過這個 package,在我開始寫我那個 Windows app 的時候,這個 package 還沒出現,所以我自己在內部自己寫了一個 web view plugin,既然我已經寫好了,也沒什麼動力換成別人的元件。不過,如果晚個兩三個月開發,或許可以輕鬆一些。
不過, Windows 系統自己沒有 WebView 2,就算在開發過程中可以輕鬆使用人家寫好的 webview,在 App 寫完,要弄 Installer 的時候,你的 Installer 就得能夠把 WebView 2 一起裝到用戶的系統裡頭-Windows 可不像別的平台,你在別的平台可以在 IDE 裡頭打包成像 apk 之類的模式上傳上架,Windows 上可是要搞 Installer 的,而且微軟在講解怎樣讓 Installer 安裝 WebView 2 的時候,用的範例還是那套超麻煩的 WiX 工具。WiX 啊…那又是另外一個故事了。
鍵盤 Bug:Flutter 在 Windows 上有個 Bug,會把右邊的 Shift Key 誤判成 Capslock,所以,如果你有一個輸入 email 的欄位,很有可能用戶在輸入 @ 之後,後面的字母全都變成大寫,非常惱人。
在Flutter 論壇上的 issue 75675 中,可以看到相關討論。在最新版本的 Flutter 2.2 中,這個問題也還沒修正,不過在同一個討論串中,有一個目前的暫時解法,就是增加一個攔截鍵盤處理的 Widget,然後把你原本的 Widget Tree 統統放到這個新的 Widget 中。
X.509 憑證:在我的 App 裡頭,需要處理 X.509 憑證。不單單是我的連線需要加上 private key 以及 certificate,這點 Dart 本身的 http library 就能處理,而是,我的 app 要能夠自己產生 private key/public key,產生 CSR,還要能夠驗證收到的 certificate 是否正確。
不得不說 Flutter 其實已經是個很完整的生態系,dart pub 上我需要的 library 都有,不過分散在很多個不同的 package中,而且是不同作者寫的。x509 library 可以解析 PEM 轉成 certificate,x509csr 則可以產生 RSA private/public key,以及從 key 產生 CSR。
分散在兩個不同的 package 中,比較討厭的,就是驗證 certificate 這一步,因為這會同時用到這兩個 package,而且名稱很像,一邊會叫做 RsaPublicKey,另一邊又叫做 RSAPublicKey ,然後這兩個 package 都很有意識的把 key 寫成 abstract class,所以你可能會寫出這樣的東西:
好醜啊。