Flutter和桌面應用的最新進展

2020-12-23 51cto

 

眾所周知,在開發 Flutter 時,我們希望通過單一代碼庫支持 Flutter 在各類設備 (包括 iOS、Android、Windows、Linux、macOS 和 Web) 上的應用,並實現原生編譯和遊戲級別的視覺效果。Flutter 也已經在 Google 內部廣泛用於 Assistant、Stadia、Cloud Search 以及 Blogger 等項目。在 Google 之外,字節跳動、Grab、Nubank 以及 MGM Resorts 等公司也都已採用 Flutter,並通過 Flutter 提升了生產力和靈活性。

很多人都想了解 Flutter 在桌面作業系統 (包括 Windows、macOS 和 Linux) 上的進展: 據調查和 GitHub 數據顯示,Flutter 的桌面支持一直是最受期待的新功能之一。未來數周內,我們將為大家帶來更多這方面的進展;同時,我們認為有必要先展示來自各個產品功能團隊的成果 (這些成果最終會整合進完整的項目中),並搜集大家的反饋。雖然桌面支持目前已推出技術預覽版本,但我們仍然有大量工作需要完成。

發布模式

繼 macOS 之後,我們還為 Flutter 增加了 Windows 和 Linux 系統的 Profile Mode (性能模式) 和 Release Mode (發布模式) 。例如,如果您運行的是最新版 Flutter,現在可以使用 flutter build windows 命令,將 Flutter 應用編譯為 Windows 可執行文件。此操作使用我們在生產環境中的 AOT 編譯器來創建原生 x64 機器代碼,而這些代碼可分發至那些未安裝 Flutter 的設備上。

https://github.com/flutter/flutter/issues/38477

https://github.com/flutter/flutter/issues/38478

https://en.wikipedia.org/wiki/Ahead-of-time_compilation

桌面級體驗

無論您要構建的是獨立可執行文件還是 Web 應用,桌面級體驗都有其獨特的屬性: 桌面窗口通常採用橫屏模式並可以調整大小、輸入通常由物理鍵盤和滑鼠完成,而不是通過屏幕鍵盤和觸摸操作,同時,控制項也是基於不同的屏幕內容密度進行的優化。

在框架層面,我們對 Flutter 進行了多項變更以支持桌面級體驗。

  •  在最新版本 Flutter 中創建新項目時,您會看到默認模板包含了對 visualDensity 屬性的引用,該屬性允許控制項根據目標平臺調整其密度,從而在桌面平臺上實現更緊湊的間距。其中一個例子就是 TextField: 它可根據指定的密度提供緊湊 (compact)、舒適 (compact)、標準 (standard) 三種間距。
  •  我們優化了對滑鼠和鍵盤輸入的支持,其中包括 Windows 上的原始鍵代碼、滑鼠右鍵操作、光標更改和滾輪支持。
  •  您現在可以 (通過 Platform 類) 查詢特定平臺,Windows、macOS 和 Linux 平臺均可提供恰當的查詢結果。
  •  我們在最新版本中添加了一個 NavigationRail widget,該 widget 專為在桌面設備和平板電腦上打造桌面級體驗而設計。
  •     visualDensity

https://api.flutter-io.cn/flutter/material/ThemeData/visualDensity.html

https://github.com/flutter/flutter/issues/43350

https://api.flutter-io.cn/flutter/material/TextField-class.html

  •  為 TextField 實現 visualDensity

https://github.com/flutter/flutter/pull/51438

https://github.com/flutter/flutter/issues/52264

  支持光標更改

https://github.com/google/flutter-desktop-embedding/issues/376

https://api.flutter-io.cn/flutter/material/NavigationRail-class.html

外部函數接口

Dart 團隊一直在努力完善外部函數接口 (Foreign Function Interface, FFI) ,以加速平臺集成的進程。對於基於 C 語言的 API,dart:ffi 庫提供了一種直接綁定到原生代碼的機制;Dart 運行時則提供了在 Dart 對象支持的堆上分配內存並調用動態連結庫的功能。

https://dart.cn/guides/libraries/c-interop

以下代碼片段為 Windows 系統環境中的一個簡單示例,該示例完全使用 Dart 代碼來調用傳統的 Win32 MessageBox() API:

  1. typedef MessageBoxNative = Int32 Function(  
  2.     IntPtr hWnd, Pointer<Utf16> lpText, Pointer<Utf16> lpCaption, Int32 uType);  
  3. typedef MessageBoxDart = int Function(  
  4.     int hWnd, Pointer<Utf16> lpText, Pointer<Utf16> lpCaption, int uType);  
  5. final user32 = DynamicLibrary.open('user32.dll');  
  6. final win32MessageBox =  
  7.     user32.lookupFunction<MessageBoxNative, MessageBoxDart>('MessageBoxW');  
  8. void showMessageBox(String message, String caption) => win32MessageBox(  
  9.     0,                      // No owner window  
  10.     Utf16.toUtf16(message), // Message  
  11.     Utf16.toUtf16(caption), // Window title  
  12.     0                       // OK button only  
  13.     );  
  14. …  
  15. showMessageBox('Test Message', 'Window Caption'); // call just like any other Dart function 

https://gist.github.com/timsneath/181092c75864001ca37b1b1495b9b396

在上例中,我們通過兩個 typedef 分別體現了方法的原生和 Dart 版本形式。完成這些定義後,我們便可通過 lookupFunction() 方法加載 Windows 動態連結庫 (DLL),lookupFunction() 負責將方法籤名映射到底層的原生入口,DLL 則負責提供方法的實現。最後,我們可以選擇添加一個簡單的慣用包裝器,使其便於從其他 Dart 代碼進行訪問,運行結果如下:

△ 使用 Win32 MessageBox API 的 Windows 簡單示例應用

當然,您不必親自完成這項工作: 有人很可能已經處理好了您要使用的 API。您可以閱讀我們的官方文檔,詳細了解如何在 Flutter 中使用 FFI。

https://pub.flutter-io.cn/packages/win32

https://flutter.cn/docs/development/platform-integration/c-interop

更新插件模型

從設計上說,Flutter 本身的核心很小。Flutter 並沒有在框架中提供海量內容,而是通過插件和 package (無論是直接來自 Flutter 團隊還是來自更廣泛的生態系統中的貢獻者) 來實現與底層作業系統的集成。

但是,隨著 Flutter 對行動裝置、Web 和桌面端的支持日益增多,為每個目標平臺開發插件也變得越來越具有挑戰性。更可能出現的情況是: 一個插件需要多個掌握各自平臺專業知識的作者通力合作,才能完成開發。

一個可行的做法是,在核心插件中定義出通用接口,並在各個平臺上獨立完成具體的實現。因此,正如近期一篇關於現代插件開發的博文所述,我們最近對插件的架構進行了調整,使多個作者能夠更加輕鬆地合作完成各個平臺的開發。基於目前的進展,插件現在可以明確地聲明其所支持的具體平臺。

https://medium.com/flutter/modern-flutter-plugin-development-4c3ee015cf5a

https://flutter.cn/docs/development/packages-and-plugins/developing-packages#plugin-platforms

我們已經開始使用此模型來構建一些核心插件,您也可以在 flutter/plugins repo 中找到一些基於這個聯合開發模型的早期示例。

https://github.com/flutter/plugins/tree/master/packages/path_provider

請注意,Windows 和 Linux 插件 API 仍在開發之中,因此,雖然我們鼓勵大家多多探索,但目前尚未準備好用於通用生產環境。我們也致力於在 pub.dev 上添加桌面平臺標籤。

在 Windows 上運行: Win32 和 UWP

在 Windows 上進行開發有一個很有趣的點在於,我們會試驗各種架構方法。在任何平臺上,Flutter 應用其實都是內嵌於一個很小的容器應用 (即 "embedder") 中的,這種做法類似 Unity 等遊戲引擎。這種特定於平臺的容器應用負責提供入口,與底層作業系統進行協調以使用表面渲染、無障礙功能和輸入等服務,並管理消息事件循環。

Windows 提供了兩種不同的方法來創建這個容器應用。第一個是使用成熟的 Win32 編程模型來創建 Flutter 內容的入口;這為 Windows 7 等平臺提供了最大的向後兼容性,同時能構建出符合諸多開發者預期的標準 EXE 文件。第二個則是現代 UWP 應用模型,推薦在 Windows 10 上使用。這種方法擁有更廣闊的想像空間,比如能夠幫助開發者將 Flutter 支持擴展至 Xbox 等設備或即將推出的 Windows 10X 作業系統。

https://docs.microsoft.com/en-us/dual-screen/windows/get-dev-tools

我們一直與多位社區貢獻者一起探討本文所述的不同解決方案。同時我們很期待與微軟緊密合作,共同完成高質量的解決方案。Surface 系列設備正不斷擴展,現在其產品已涵蓋 Android 和 Windows。我們認為 Flutter 可為微軟提供非常有吸引力的平臺,橫跨其全部產品陣容並提供卓越的原生體驗。

盡情探索桌面體驗

桌面體驗目前仍處於技術預覽版狀態,而 API 和工具尚不穩定。在將桌面支持升級到穩定版本之前,我們仍將持續跟進大量需要完成的必要工作,包括改進無障礙功能和本地化支持。

如果您想要試用,則需要使用開發版本。Windows 和 Linux 支持目前僅在 master 渠道上可用,我們也在這個渠道中積極進行著 Flutter 的開發。macOS 在 dev 渠道上可用,雖然穩定性較好,但不建議用於生產環境。您可以在 Flutter master 渠道或 dev 渠道之間進行切換,然後使用以下任一命令來為您使用的平臺提供支持:

  1. C:\flutter> flutter config --enable-windows-desktop  
  2. $ flutter config --enable-macos-desktop  
  3. $ flutter config --enable-linux-desktop 

一些積極探索的開發者已經 "嘗鮮",在桌面環境中利用 Flutter 創建應用。我們見證的首批 Flutter macOS 桌面應用便包括 Sharezone,這是一款針對德國教育市場的學生管理應用,最初創建的是移動應用版本,但最近增加了網頁和桌面版本。

△ Sharezone Schulplan: 一款面向學生、教育工作者和家長的應用,用於跟蹤家庭作業、學習小組和課程表等情況

https://sharezone.net/

在接下來的數周裡,我們將分享更多關於桌面支持的信息;同時,我們也期待著聽到您的反饋。如果您是插件作者,我們建議您開始評估將自己的插件適配至即將到來的這些桌面平臺所需要的開發工作;如果您已發布應用,不妨嘗試將應用作為桌面應用運行,並告訴我們您的運行情況。

【編輯推薦】

【責任編輯:

龐桂玉

TEL:(010)68476606】

點讚 0

相關焦點

  • Google同時啟動Flutter 1.2和Dart 2.2
    儘管Flutter是應用程式開發框架列表中的新增內容,但它已在行動應用程式開發人員的社區中佔據了一席之地。換句話說,Flutter是一個UI(用戶界面)框架,可用於構建交互性強,本質上流暢的跨平臺的應用程式,主要用於Android和iOS平臺。
  • 解決flutter運行報錯:flutter_tools depends的處理方法
    我是您的朋友義縣遊學電子科技.今天帶來的flutter的錯誤解決方法是關於web平臺運行時提示:"Because flutter_tools depends on shelf_packages_handler any which doesn't exist(could not find package
  • Flutter 實現刮刮卡效果
    我們將了解如何在flutter應用程式中使用scratcher包實現刮板卡。目錄刮刮卡 刮刮卡是您在不同的購物應用程式和支付應用程式上可以看到的著名事物之一。這些刮刮卡用於為用戶提供獎品和現金返還。它顯示了刮卡將如何工作使用scratcher在Flutter應用程式包。它顯示打開的對話框,然後顯示刮刮卡,您將獲得收入。它會顯示在您的設備上。屬性 scratcher的一些屬性是:**child:**此屬性用於聲明容器和不同的Widget。**brushSize:**此屬性用於在劃痕期間提供不同大小的畫筆。
  • Flutter到底香不香?
    今晚停電,導致沒法寫代碼,聊一聊flutter,早就想聊了,一直沒時間。每個新的框架的出現都會引來大家的討論,flutter也不例外。大公司對於新技術會比較慎重的,穩定才是王道。去年在我開發一款代購產品時,我決定嘗試使用flutter,使用一周以後我徹底愛上了它。flutter中萬物皆為widget的思想與Java中的萬物皆對象如出一轍。很多人不習慣flutter手寫布局的方式,但是這麼長時間用下來之後,我覺得效率並不低。
  • 如何使用BLoC架構開發Flutter應用
    簡單可測強大BLoC體系結構允許開發人員將應用程式的不同層分開,即視圖層和業務邏輯層。這樣可以輕鬆測試和重用代碼不同部分中的元素。由於此體系結構使應用程式的各個部分保持較小且獨立,因此您可以輕鬆地測試應用程式的各個方面,並確切知道要解決的問題。 此外,BLoC體系結構採用單一方法來更改整個應用程式中的狀態,從而使應用程式的業務邏輯可預測且一致。
  • Flutter 1.20穩定版發布 基於Dart程式語言2.9版本構建
    具體更新內容如下:  性能改進  • 修復了 icon font tree shaking 有關的工具性能問題,並將 font tree shaking 作為構建非 Web 應用程式時的默認設置。此功能通過刪除未使用的任何圖標來減小應用程式的大小。
  • Flutter實戰篇:計數器實例Demo分析
    Flutter是一款行動應用程式SDK,一份代碼可以同時生成iOS和Android兩個高性能、高保真的應用程式。Flutter目標是使開發人員能夠交付在不同平臺上都感覺自然流暢的高性能應用程式。我們兼容滾動行為、排版、圖標等方面的差異。為什麼要用Flutter?Flutter有什麼優勢?
  • 新的谷歌聊天桌面應用程式是一種漸進式Web應用程式
    Google與消息傳遞應用程式之間有著長期的動蕩關係,其最新成果是與Google Chat。Google聊天室以前稱為Hangouts聊天室,是該公司面向G Suite用戶的類似於Slack的團隊交流平臺。請勿將其與「經典」環聊或已死的「 GChat」相混淆。Google現在發布了更新的Chat桌面客戶端。
  • flutter控制項:pageview的使用案例分析和重點說明
    今天我來跟您介紹一下flutter的控制項使用案例。一是工作之餘興趣愛好,二是作為一個學習總結,把學習的過程記錄下來。那我今天會把一個項目中用到的控制項逐一進行總結,希望大家多多支持。因為從這個事例中我們可以完全連接flutter的開發思想和編程方法,話不多說我們進入正題。1.配置好你的flutter環境,我這邊以web瀏覽器環境為演示的平臺。開發工具為vs code.如果不出意外,你只要把我這邊的代碼複製到vs code裡就應該可以正常運行的。
  • 用JavaScript寫桌面應用?這五個框架一定要用到!
    很久以前,開發客戶端桌面程序需要我們掌握各種複雜的技術,不過現在,我們只需要使用js就可以開發出桌面應用程式,下面我們盤點5個開發桌面應用程式的框架。 Electron
  • 只能用網頁版了 Facebook將月底停用Windows桌面應用
    來源:快科技近日,Facebook團隊於近日向用戶群體發送一則郵件通知,稱Windows版的Facebook桌面應用將會在2月28日正式停用,停用期間,用戶可以通過瀏覽器登陸Facebook官網進行網頁版的使用。
  • 如何在Flutter行動應用程式中集成人工智慧或AI?
    AI整體增長中包含的廣泛應用是自然語言處理,機器人過程自動化和機器學習。隨著領先的科技公司迅速顯示出對AI投資的興趣,越來越多的用戶將繼續看到該技術在產品和應用程式中的集成。因此,讓我們快速瀏覽一些早期採用者,這些早期採用者通過將其業務應用程式與ML和AI相融合而樹立了行業標杆。1.
  • 微軟Lumia 950 XL支持運行 Win10 x64 仿真桌面應用
    IT之家12月27日消息 外媒 Windows Latest 報導,Windows 10 Mobile 平臺設備已經停產,但現有的 Windows Phone 仍然足夠強大,可以測試 Windows 10 ARM 的新功能,包括 x64 應用仿真。
  • 統信桌面作業系統V20個人版(1010)發布,支持QQ、微信等流行應用
    與個人體驗版相比,統信桌面作業系統V20個人版(1010)提供全新設計的啟動器菜單、雙內核機制、系統體驗工具、系統備份還原、指紋識別、系統安全增強等功能,系統部分預裝應用升級到最新版本,提高了系統的穩定性和兼容性。在滿足基本的功能之外,未來還將提供增值服務,解鎖系統更多高級功能,給用戶帶來不一樣的體驗。
  • Win10桌面版Instagram應用終發布:界面簡潔
    繼今年4月Win10 Mobile版Instagram印刷上線後,今日,Windows10桌面版Instagram應用終於正式上架Windows商店。Win10桌面版Instagram應用終發布:界面簡潔  與其他版本不同的是,Win10桌面版Instagram應用主界面只佔用屏幕的中心位置,兩側留下了大量空白空間。
  • 麒麟信安雲桌面助力信創安全應用
    作為基礎軟體的先行者,麒麟信安依託十多年的行業積澱,近年來不斷創新突破,碩果纍纍,「一雲多芯」信創雲桌面引領行業創新應用。當前國際上計算機信息系統架構正從傳統的「計算機+網絡」向「雲+端」演進。2019年是雲計算的分水嶺,今年已發展到「上雲是常態,不上雲是意外」。基於虛擬化技術的雲桌面已成為和傳統PC桌面相併列的新模式,雲辦公和移動辦公正在成為新常態。
  • 「首席架構師推薦」棒棒的Flutter庫,工具,教程,文章列表(1)
    Flutter是一款移動應用SDK,可通過單一代碼庫為iOS和Android構建高性能,高保真的應用。Iirokrankka.com - 文章和教程以及Iiro Krankka相關的任何內容。Norbert - Norbert515的深度文章,功能和應用程式創建。Flutter Tips - DiegoVelásquez開發的文章,提示和技巧。
  • 微軟Windows 10郵件和日曆桌面應用廣告回來了 並且不可移動
    微軟Windows 10郵件和日曆桌面應用廣告回來了 並且不可移動 站長之家(ChinaZ.com) 12月18日 消息:據mspoweruser報導,微軟近日再次在郵件和日曆的桌面應用添加了小橫幅廣告
  • Win10 應用 Lively 壁紙上架,支持動態主題桌面
    IT之家12月6日消息 外媒 Windows Latest 報導,一款新的微軟商店應用為 Windows 10 帶來了動態動畫桌面。Windows 10 包含了多種設置,可以改變桌面和應用的外觀,讓作業系統的感覺更加個性化。
  • 最新綜述:偏振信息傳輸理論及應用進展
    偏振信息傳輸理論及應用進展(特約)doi:10.3788/IRLA20201013----2020年第49卷第6期根據電場矢量的末端在垂直於傳播方向的平面內振動規律的不同,可以劃分為攜帶不同散射特性的偏振光(線偏振光、圓偏振光和橢圓偏振光)。目前,隨著偏振信息理論和技術的發展,光的偏振在遙感、水下成像、生物醫學、通信和目標識別等領域的應用越來越受到國內外專家學者的重視,圖1 展示了偏振信息技術的典型應用場景。