副標題:在Ambient Computing願景上的一些進展html
原文地址:medium.com/flutter/flu…linux
原文做者:medium.com/@timsneathandroid
咱們對Flutter的使命是針對各類各樣的設備--包括iOS、Android、Windows、Linux、macOS和web--從單一的代碼庫,用原生編譯和遊戲質量的視覺效果,這不是什麼祕密。在谷歌內部,從Assistant到Stadia,從Cloud Search到Blogger,都有項目使用Flutter。而在Google以外,Flutter已經被從ByteDance到Grab,從Nubank到MGM Resorts等公司採用,他們都從Flutter的生產力和靈活性中受益。git
大家中的許多人對包括Windows、macOS和Linux在內的桌面操做系統的進展很感興趣:在調查和GitHub上,桌面一再成爲最受歡迎的新功能之一。在接下來的幾周裏,咱們將在這裏展現更多的工做,咱們認爲咱們應該先調查一下爲整個項目作出貢獻的各個功能團隊的一些工做。雖然桌面支持目前是技術預覽版,但咱們已經作了大量的工做。github
最近,咱們除了現有的對macOS的支持外,還支持了Windows和Linux的配置文件和發佈模式。例如,若是你正在運行Flutter的最新構建,你如今能夠用flutter build windows
將Flutter應用程序編譯成Windows可執行文件。這使用咱們生產的AOT編譯器來建立原生x64機器代碼,能夠分發到沒有安裝Flutter的機器上。web
不管你是在構建獨立的可執行文件仍是Web應用程序,構建桌面級體驗都有獨特的屬性。桌面窗口一般是橫向模式,而且能夠調整大小;輸入一般來自物理鍵盤和鼠標,而不是屏幕上的鍵盤和觸摸;控件針對不一樣的屏幕密度進行了優化。macos
在框架層面,咱們對Flutter進行了各類改變,以支持桌面類體驗。編程
當你在最近的構建中建立一個新的項目時,你會看到默認模板如今包括一個對visualDensity
屬性的引用,它容許控件根據它們所針對的平臺來調整它們的密度,在桌面平臺上的間距更加緊湊。如何使用這個的一個例子是TextField
,它如今根據指定的密度提供緊湊、溫馨和標準的間距。windows
你如今能夠查詢特定的平臺(經過Platform
類),Windows、macOS和Linux都能提供相應的結果。
在最新的版本中,咱們增長了一個NavigationRail
小部件,專門爲桌面和平板電腦上的桌面類體驗而設計。
Dart團隊一直在努力打磨外函數接口(FFI),這是平臺集成的一大速度助推器。對於基於C語言的API,dart:ffi
庫提供了一個直接綁定本地代碼的機制;Dart運行時提供了在堆上分配由Dart對象支持的內存,並對動態連接的庫進行調用的能力。
對於一個來自Windows的簡單例子,這裏是一個徹底用Dart代碼調用傳統的Win32 MessageBox()
API的代碼片斷:
typedef MessageBoxNative = Int32 Function(
IntPtr hWnd, Pointer<Utf16> lpText, Pointer<Utf16> lpCaption, Int32 uType);
typedef MessageBoxDart = int Function(
int hWnd, Pointer<Utf16> lpText, Pointer<Utf16> lpCaption, int uType);
final user32 = DynamicLibrary.open('user32.dll');
final win32MessageBox =
user32.lookupFunction<MessageBoxNative, MessageBoxDart>('MessageBoxW');
void showMessageBox(String message, String caption) => win32MessageBox(
0, // 無主窗口
Utf16.toUtf16(message), // 消息
Utf16.toUtf16(caption), // 窗口標題
0 // 單OK按鈕樣式
);
…
showMessageBox('Test Message', 'Window Caption'); // 像其餘Dart函數同樣調用
複製代碼
用Dart代碼調用Win32 MessageBox API。完整的例子在這裏。
在這段代碼中,咱們提供了typedef
來表示方法的簽名,包括本地和基於Dart的表示。有了這些定義,咱們能夠加載Windows動態連接庫(DLL),經過lookupFunction()
方法提供函數的實現,將Dart函數簽名映射到底層的本地入口點。最後,咱們有選擇地添加一個簡單的習慣性包裝器,使其易於從其餘Dart代碼中訪問,結果是這樣的:
一個使用Win32 MessageBox API的簡單的Windows示例應用程序。
固然,你沒必要本身作這項工做:有可能有人已經爲你想使用的API鋪平了道路。你能夠在咱們的文檔中閱讀更多關於使用Flutter的FFI的信息。
經過設計,Flutter自己有一個小的核心。插件和包(不管是直接來自Flutter團隊仍是更普遍的貢獻者生態系統)並無給基礎框架增長重量,而是提供與底層操做系統的集成。
然而,隨着Flutter愈來愈多地支持移動、Web和桌面,爲每一個支持的平臺開發一個插件變得愈來愈有挑戰性。一個插件更有可能須要在每一個平臺上具備專長的不一樣做者的貢獻。
一個有用的技術是定義一個通用的接口做爲核心插件的一部分,每一個平臺均可以獨立實現。所以,正如最近一篇關於現代插件開發的文章中所描述的那樣,咱們最近調整了插件的模式,以使平臺開發可以更容易地在多個做者之間進行聯合。做爲這項工做的一部分,如今能夠明確聲明一個插件支持哪些平臺。
咱們已經開始使用這個模型構建一些核心插件,你能夠在flutter/plugins代碼庫中找到一些聯盟模型的早期例子。
請注意,Windows和Linux插件的API還在不斷變化中,因此雖然咱們鼓勵探索,但目前咱們尚未準備好提供通用的生產支持。咱們也在努力在pub.dev上添加桌面平臺標籤。
咱們在Windows上所作的工做的一個有趣的方面是實驗各類架構方法。在任何平臺上,Flutter都被嵌入到一個小型主機容器應用程序("嵌入器")中,使用相似Unity等遊戲引擎的方法。這個特定於平臺的嵌入器提供了一個入口點,與底層操做系統協調,以訪問渲染面、可訪問性和輸入等服務,並管理消息事件循環。
Windows爲建立這種嵌入器提供了兩種不一樣的方法。首先,可使用成熟的Win32編程模型來建立Flutter內容的入口點;這爲Windows 7等平臺提供了最大的向後兼容性,並構建了一個標準的EXE文件,許多開發人員都會期待。相反,現代UWP應用程序模型是Windows 10的推薦方法,併爲將Flutter支持擴展到Xbox或即將推出的Windows 10X操做系統等設備提供了使人感興趣的機會。
咱們一直在與各類貢獻者進行非正式合做,探索這裏的不一樣解決方案,並樂意支持與微軟的密切合做,以完成高質量的解決方案。隨着Surface系列設備擴展到包括Android和Windows,咱們認爲Flutter爲微軟提供了一個使人信服的平臺,以構建跨越其整個產品組合的美麗的本地體驗。
這項工做仍處於技術預覽階段,API和工具還沒有穩定。咱們仍在跟蹤大量的工做,咱們但願在將桌面支持推廣到穩定以前完成,包括改進的可訪問性和本地化支持。
若是你想嘗試一下,你須要上一個開發頻道。Windows和Linux只能在master
分支上使用,這是活躍的Flutter開發的地方。macOS能夠在dev
分支上使用,它稍微穩定一些,但不建議用於生產。你能夠用flutter channel master
或flutter channel dev
切換通道,而後使用這些命令之一來啓用對你使用的平臺的支持。
// 在Windows上
C:\flutter> flutter config --enable-windows-desktop
// 在macOS上
$ flutter config --enable-macos-desktop
// 在Linux上
$ flutter config --enable-linux-desktop
複製代碼
咱們已經看到一些富有冒險精神的開發者開始利用Flutter在桌面上建立應用。咱們看到的首批Flutter macOS桌面應用之一是Sharezone,這是一款針對德國教育市場的學生計劃書,它最初是一款移動應用,但最近增長了網頁和桌面版本。
Sharezone Schulplan--一款爲學生、教育工做者和家長提供跟蹤做業、學習小組和時間表的應用。
咱們將在將來幾周內分享更多關於桌面版支持的信息;與此同時,咱們很想聽到更多關於您的經驗。若是你是一個插件做者,咱們鼓勵你開始評估工做,以支持這些即將到來的桌面平臺;若是你已經發布了一個應用程序,爲何不嘗試將其做爲桌面應用程序運行,並讓咱們知道你是進展如何?
經過www.DeepL.com/Translator(免費版)翻譯