農林漁牧網

您現在的位置是:首頁 > 林業

Windows版Flutter應用開發體驗遠達不到Android和iOS的水平

2022-08-09由 CSDN 發表于 林業

計算器不顯示了怎麼修

作者 | Lew C

譯者 | 彎月

出品 | CSDN(ID:CSDNnews)

我個人是Flutters的忠實粉絲。我非常喜歡Flutter,以至於有些專案最初選用了其他程式語言,而且幾乎已編寫完成,但後來我決定棄用,並改用Flutter重寫,因為我相信

為了將想法轉化為應用程式,使用Flutter是最簡單的方法

。我曾寫過一些關於Flutter的文章,而且還花了大把時間建立有關Flutter的內容。

為此,我投入了大量時間研究Flutter應用。我非常希望Flutter能夠在Windows上穩定執行。近幾年來,Windows開發一直處於萎靡不振的狀態,實際上,幾乎沒有人制作Windows原生應用程式。大多數應用都是Electron或漸進式Web應用。

根據在Android和iOS上開發Flutter應用的經歷來看,我認為Flutter整體都保持了高質量。從UI的佈局方式到“

本週小工具推薦

”的推廣影片,Flutter的一切都讓我著迷。然而,在2022年初,我嘗試了Flutter對Windows的支援,我認為目前

該專案還處於實驗性階段,要達到穩定狀態還有很長的路要走。

Windows版Flutter應用開發體驗遠達不到Android和iOS的水平

CSDN付費下載自視覺中國

Flutter為了支援Windows,並達到如今的水平已經付出了艱辛的努力。但是,目前的狀態仍然非常粗糙,幾乎無法正常使用。平心而論,如果只是想建立一個簡單的應用,不需要與Windows平臺整合,或者有現成的外掛,那麼完全沒問題。如果你只想為朋友或同事建立一個簡單的應用,不必關心應用是否會崩潰,那麼也不會有任何問題。

但是,既然Flutter已經打上了“

穩定版

”的標籤,它對Windows的支援就應該能達到生產水平,並且能夠像其他穩定的、受支援的平臺(如Android或iOS)一樣輕鬆使用。

我認為“同等水平的穩定體驗”指的是

平臺能夠獲得全面的支援

,就像iOS和Android一樣,而且具有良好的體驗。然而,儘管Windows平臺的Flutter也是“穩定”的,但體驗卻完全不同。與Flutters對Android和iOS的支援相比,Flutter對Windows的支援有以下明顯的缺陷:

為了建立外掛,需要掌握C++。而實際上在Windows上開發應用本來應該使用C#或。NET才對。

如果應用想整合其他原生C++庫,則需要掌握C++ 和 CMake。

原生庫丟擲的異常往往會導致應用在桌面系統上崩潰,但在移動裝置上,原生異常似乎不會導致應用直接退出。

缺乏文件陳述基本工作原理,以及CMake的構建過程(CMakeLists。txt中只有非常簡單的註釋)。

Android和iOS版本會針對目標裝置生成一個可安裝的檔案。

而Windows的構建只能生成一堆檔案,你必須自行打包。

這是因為在iOS上使用Flutter和在Windows上使用(兩者都是“穩定”平臺)的體驗截然不同。根據我的經驗,感覺Flutter在移動端“非常穩定”,但在桌面系統上的體驗卻一言難盡……

下面,我們就來詳細討論其中的一些

關鍵點

使用極其不方便的平臺框架

大多數Flutter應用既可以使用基本框架提供的功能,也可以使用外掛提供的功

能。如果你只想建立一個計算器,則不需要使用任何工具包。但是,如果你想建立一個可切換模式的計算器,並儲存使用者當前的模式,則需要使用shared_preferences之類的包。

這類的包帶有“

平臺實現

”,即指定在相應的底層平臺上應該執行何種操作。而“平臺通道”則可以將資訊從多個平臺的Flutter程式碼傳輸給這些特定於平臺的實現。

有時,現有的外掛或包無法滿足你的需求,你需要自己動手實現。在Android和iOS上,自己動手實現沒有任何問題,而且效果很好。對於iOS,你可以使用Swift或Objective-C;而對於Android,你可以使用Java或Kotlin。你甚至可

以利用包來生成一些繫結,並享受額外的型別安全。

Windows版Flutter應用開發體驗遠達不到Android和iOS的水平

CSDN付費下載自視覺中國

對於Android開發,我們自然會選擇Java或Kotlin;而對於Windows,我們會選擇。NET。理由非常充分,因為該語言能夠在易用性和效能之間取得良好的平

衡,同時還可以減少開發人員編寫應用所花費的時間。

另外,現在已有成千上萬(當前約有281,952 個)的NuGet包,它們幾乎覆蓋了Windows所有的功能和外圍裝置。在Windows上構建Flutter應用時,瞭解C#與平臺通道的基本知識,可以降低編寫特定於平臺的程式碼的難度。

Windows平臺上的Flutter應用實際上只是Win32應用。如果想編寫特定於平臺的程式碼,你必須使用C++編寫程式碼。然而,使用C++的NuGet包數量非常少。如果你想使用特定於平臺的功能,就需要花費大量時間在Windows上用

C++重新實現這些功能。

核心問題

假設你想在Windows上編寫一個Flutter應用,但你的應用打算利用特定平臺特

定的功能,可惜沒有現成的庫可以使用,於是你決定自己寫一個。

那麼,上哪兒去找相關的文件呢?Flutter網站上有很多Android和iOS相關的文件,所以我們假定照貓畫虎也能在Windows上實現。例如,這個網頁

(https://docs。flutter。dev/development/packages-and-plugins/developing-packages#plugin-platforms)

說明了如何利用Kotlin建立Android外掛,如何利用Swift建立iOS外掛,卻沒有Windows的相關說明。

經過一番搜尋後,我找到了Google Codelab於2022 年 1 月發表的這篇文章

(https://codelabs。developers。google。com/codelabs/flutter-github-client?hl=en#5)

,其中說明了建立Windows外掛的基本步驟。我可以按照這篇指南的說明,構建外掛的基本框架。

下面,我需要實現外掛的功能。這個過程非常令人沮喪,而且極易出錯,我非常希望能擁有pigeon這類的庫,在應用和編寫的外掛之間生成型別安全的繫結。然而,這個庫只支援Android和iOS。

所以,我需要從零開始編寫平臺通道實現。但是,如果我在原生程式碼中遇到問題,該怎麼辦?

關於這個問題,目前仍然是未解之謎。

Flutter網站沒有提供任何相關的文件,所以你只能自己實驗,看看能否找到合適的方法。

如此一來,我們面臨的困境就顯而易見了,根據我的經驗,如果外掛丟擲原生異常,就會導致桌面系統上的應用崩潰,並且Android Studio會丟擲訊息“與裝置的連線丟失”。在經過一系列故障排除之後,最後發現我需要開啟Visual Studio,將偵錯程式附加到程序,然後復現應用程式崩潰。Visual Studio才會捕獲崩潰,並顯示導致原生崩潰的程式碼的位置。

這意味著,在除錯的過程中,我需要透過Android Studio執行應用程式,然後在崩潰發生之前瘋狂地嘗試重新連線偵錯程式。你需要安裝一個Visual Studio的外掛,例如ReAttach,等待程序出現,然後附加到它。然而,這個過程也沒有相關的文件說明,即便是這種方法能行得通,也會十分蹩腳,而且恐怕你也不確定自己的做法是否正確。

但在偵錯程式成功地附加到程序之後,我對實際情況就有了一定的瞭解。接下來,我需要連結原生Windows外掛所依賴的另一個庫。但是Visual Studio有一個很酷的GUI,所以只需點選滑鼠右鍵就可以新增引用了,是嗎?不,並沒有那

麼簡單。

你還需要了解CMake

我發現,在Visual Studio中新增外掛的引用不會影響底層專案。我嘗試了一

下,新增引用,然後檢查Git中的變更,卻發現什麼都沒有。

我花了大量時間研究這個問題,最後發現Windows上的應用其實是CMake專案。我們在Visual Studio中操作的一切,包括解決方案檔案、專案檔案,都只不過是CMake的構建產物而已。只要執行flutter build windows,這些檔案就會被覆蓋。

因此,我不能使用Visual Studio來配置專案、新增引用或做任何事情。我只能研究一下如何透過CMake來完成這些工作。此外,我甚至不能透過 Visual Studio安裝NuGet包,我必須搞清楚如何透過CMake安裝這些NuGet包。

我不太熟悉CMake,它於22年前問世,看起來非常龐大而複雜。坦白來講,鑑於C++生態系統的廣度與深度,以及由C++工具鏈構建的裝置數量,CMake如今的規模也不足為奇。瞭解CMake與Flutter Windows專案之間的互動是一項艱鉅的任務,但為了保證專案順利進行,你必須有一定程度的瞭解。

至於相關文件,非常欠缺,甚至可能壓根沒有。其實我認為這個任務難度不是特別大。任何釋出生產級應用的人都會遇到此類問題。就我而言,我嘗試Sentry Native整合到我的Flutter桌面應用中,這樣在應用崩潰時,我就會收到一些通知。無論想整合哪個庫,都需要弄清楚使用哪個包,然後將什麼內容新增到CMakeLists。txt中。

C++是

一門難度比Swift或Kotlin更高的語言

。然而,現代C++已大幅簡化,但你仍然需要跟蹤指標和引用,注重效能的應用程式尤其需要注意這些方面,對於桌面應用而言,如果能換取更好的開發環境,那麼犧牲一些效能,也是可以接

受的。

Windows版Flutter應用開發體驗遠達不到Android和iOS的水平

CSDN付費下載自視覺中國

瞭解C++和CMake不是一件易事,這個要求無疑會削弱在Windows上構建

Flutter應用的吸引力

。跨平臺開發本應該更容易,而且我並不反對學習每個平臺的特性,然後部署應用。

但是,當我開啟應用的錯誤日誌,然後瘋狂地在網上搜索“如何使用CMake連線庫”時,就覺得心力憔悴。有人決定在Win32之外構建Windows版的Flutter應用,他們肯定也需要配置CMake,對不對?為什麼他們沒有寫一些文件呢?

除了上述問題之外,還有一些小麻煩,比如pubspec。yaml沒有標記成可執行檔案,因此部署更新會更加困難。雖然這個問題不難修復,但這意味著你需要自定義更多的構建過程,而且隨著Windows版Flutter應用的成熟,你肯定需要回頭重新修改這個地方。目前,Windows版的Flutter號稱是“穩定的”,但其最基本的開發流程、如何建立外掛以及如何除錯,幾乎沒有任何相關的文件。這一點

非常奇怪。

未來該何去何從?

我認為Flutter是

軟體開發中的一個革命性篇章,相信隨著時間的推移它將成為首選工具。

但是,與開發Android或iOS應用相比,Windows版應用的開發體驗相差甚遠。

我不後悔嘗試開發Windows版的Flutter應用,這是一次很好的學習經歷。我花了幾天時間尋找如何在不使用CMake的情況下連線庫,並嘗試使用C++編寫我的外掛。有一次,我花了三天時間研究整合,但最後還是不得不放棄,用git reset拋棄了全部成果。但我在這個過程中學到了很多寶貴的經驗。

我擔心人們會以為構建Windows版的Flutter應用與構建移動應用的方法相同,到頭來卻發現這兩種應用的構建截然不同,從而變得怒不可遏。在使用Flutter編寫Windows應用時,由於不清楚具體的步驟,有時就會覺得一頭霧水。

很久以前,Android版的Flutter應用也號稱是“

穩定的

”,就連iOS版的Flutter也今夕不同往日,這兩個平臺都得到了極大的改進,如今Windows正處在發展的軌道上。相信隨著時間的推移,它也會逐步得到完善。但是,Android版在釋出時,也不要求我們使用C++編寫外掛,我們可以使用Java,這門語言使用起來更加方便。而反觀Windows版的Flutter,Win32 和 C++卻成了基礎,我很難想象如何改進二者,才能讓Windows上的體驗達到與Android 或iOS相同的水平。

目前,Windows版的Flutter可能確實很穩定,因為核心產品不會發生太多崩潰,或者根本不會崩潰。但它仍有一種“不是親生”的感覺。編寫外掛很蹩腳,除錯很蹩腳,CMake的使用難度很大,等等。想一想,Windows版的Flutter需要經歷多少改進,才能達到與移動版本相同的水平。感覺目前Windows版仍處於不同的階段,比如“預釋出”?

考慮到目前在Flutter 3。0中,Linux和macOS的支援已達到“穩定”,做好了投入生產的準備(儘管也缺乏類似的文件),我們只能

希望Flutter的“穩定”不是一個泛泛的標籤。

理想情況下,我們希望能有一個Flutter的Windows社群負責人(甚至是桌面系統社群的負責人)記錄所有問題,說明CMake的構建過程,以及如何將原生庫與Flutter應用連結起來。雖然我們知道Windows版應用的開發難度比移動應用更高,但至少我們能有一些如何將它們組織起來的文件。

我並不是說,你不應該構建Windows版的Flutter應用,只不過我們需要認清現實:

Windows上的原生軟體環境是一片野草叢生的荒原,只有寥寥幾個WPF應用,而UWP應用的數量就更少了,還有一些Electron或混合應用可以滿足開發人員的需求。

我相信,在未來幾年Flutter將成為這一領域內強有力的競爭對手。

不過,就目前而言,雖然我仍然很喜歡Flutter,卻不知道如何把這種喜愛之情傳達給CMake。

原文連結:https://betterprogramming。pub/flutters-stable-experience-parity-is-becoming-a-problem-931318b4cb7b