三、Flutter Multiplatform - desktop;

Flutter for Desktop

  Flutter for Desktop最初是爲了開發FlutterWindowsmacOSLinux嵌入而建立的項目,這項工做後來成爲Flutter的一部分。而此項目如今只是在當前狀態下使用這些庫構建Flutter應用程序的示例和測試環境,它還包括一些實驗性的早期桌面插件。linux

  Flutter for Desktop仍處於早期階段。 此項目的代碼並不穩定,而且也不適合生產使用android

桌面shell

  Flutter team正在開展以擴展Flutter支持桌面應該做爲目標的工做,容許開發人員使用Flutter建立macOSWindowsLinux應用程序。git

  從長遠來看,將建立一個徹底集成的解決方案,用於桌面平臺的Flutter建立,Flutter運行和Flutter構建工做,但目前此項目仍在進行中。github

當前的狀態

Flutter桌面API仍處於開發的早期階段,若有更改,恕不另行通知。 也不會提供APIABI的向後兼容性。 在任何Flutter更新以後,使用這些庫的任何代碼都須要更新和從新編譯。shell

macOS

  這是最成熟的桌面平臺(出於各類緣由,包括它與已經支持的iOS很是接近)。macos

  以Flutter開頭的類與iOS共享,應該基本穩定。以FLE開頭的類仍處於早期階段。json

Windows

  當前的Windows shellGLFW佔位符,以便進行早期實驗。它將在將來被Win32UWP shell替換,容許在應用程序中嵌入Flutter視圖。最終shellAPI與當前實現將徹底不一樣。windows

Linux

  當前的Linux shellGLFW佔位符,以便進行早期實驗。Flutter team計劃建立一個庫,讓你能夠嵌入Flutter,不管是使用GTK +QtwxWidgetsMotif仍是其餘任意用於應用程序的其餘部分的工具包,但尚未肯定一個好的方案。 因此,目前的計劃是支持GTK +,其中添加對其餘工具包的支持將很是簡單。最終shellAPI與當前實現將徹底不一樣。緩存

Plugins

  全部平臺都支持編寫插件,可是,目前不多有插件實際上具備桌面支持(例如flutter-desktop-embedding項目中的這些插件)。bash

Tooling

  在Flutter工具中支持桌面是一項正在進行的工做。要使用任何支持(例如flutter設備列出的主機),目前必需要求:

  • 不能在穩定的Flutter channel上。這是爲了代表桌面支持還沒有被認爲是穩定的。
    • 應該始終及時更新此庫和Flutter,由於桌面的重大更改常常發生。
  • 必須將ENABLE_FLUTTER_DESKTOP環境變量設置爲true。這是爲了不在制定長期解決方案時干擾現有的移動開發工做流程。
    • macOS/Linux: export ENABLE_FLUTTER_DESKTOP=true
    • Windows: $env:ENABLE_FLUTTER_DESKTOP="true" (PowerShell) 或者 set NABLE_FLUTTER_DESKTOP=true (CMD).

預構建的Shell庫

  默認狀況下,桌面庫不會被下載,但能夠經過運行帶有--linux- macos--windows標誌的Flutter預緩存下載到Flutter的引擎工件緩存中,具體取決於開發平臺。目前只有debug庫可用。

C++ Wrapper

  WindowsLinux庫提供了C API。 爲了更容易使用它們,可使用C ++ Wrapper,能夠將其構建到應用程序中以提供更高級別的APIprecache命令會將此Wrapper的源代碼下載到庫旁邊的cpp_client_wrapper文件夾中。

使用Shells

  因爲flutter create還不支持桌面,所以須要一個runner應用程序。 flutter-desktop-embedding項目爲每一個桌面平臺提供了簡單的運行程序,可使用flutter工具進行這些桌面支持。

  或者,若是熟悉在平臺上進行原生開發,則可使用shell編寫本身的應用程序。 有關使用它們的信息,能夠參閱適用於平臺的庫附帶的標頭。未來會有更多文件; 如今,查看flutter-desktop-embedding示例以查看它是如何使用它們的。 除了連接Flutter庫以外,應用程序還須要捆綁您的Flutter assets。 在WindowsLinux上,還須要來自Flutter引擎的ICU數據(在Flutter文件夾bin/cache/ artifacts/engine目錄下查找icudtl.dat)。

Plugins
macOS

  在設置FLEViewController以前,在調用launchEngine以前...,在每一個要使用的插件上調用-registerWithRegistrar: 例如:

[XYZMyAwesomePlugin registerWithRegistrar:
      [myFlutterViewController registrarForPlugin:"XYZMyAwesomePlugin"]];
複製代碼
Windows/Linux

  建立Flutter窗口控制器後,請調用插件的註冊功能。 例如:

MyAwesomePluginRegisterWithRegistrar(
      flutter_controller.GetRegistrarForPlugin("MyAwesomePlugin"));
複製代碼

Flutter的應用要求

  因爲Flutter框架還沒有徹底支持桌面平臺,所以現有的Flutter應用程序可能須要稍加修改才能運行。

目標平臺

  大多數應用程序須要將應用程序的目標平臺覆蓋到其中一個支持的,以免「未知平臺」異常。能夠對單個目標進行編碼:

import 'package:flutter/foundation.dart'
    show debugDefaultTargetPlatformOverride;
[...]

void main() {
  debugDefaultTargetPlatformOverride = TargetPlatform.fuchsia;
  [...]
}
複製代碼

  若是代碼須要在移動設備和桌面上運行,或者您但願在不一樣的桌面平臺上運行不一樣的代碼,則可使用Platform進行區別。 例如,上面main()中的行能夠替換爲:

/// If the current platform is desktop, override the default platform to
/// a supported platform (iOS for macOS, Android for Linux and Windows).
/// Otherwise, do nothing.
void _setTargetPlatformForDesktop() {
  TargetPlatform targetPlatform;
  if (Platform.isMacOS) {
    targetPlatform = TargetPlatform.iOS;
  } else if (Platform.isLinux || Platform.isWindows) {
    targetPlatform = TargetPlatform.android;
  }
  if (targetPlatform != null) {
    debugDefaultTargetPlatformOverride = targetPlatform;
  }
}
複製代碼

注意,使用的目標平臺不只會影響窗口小部件的行爲和外觀,還會影響Flutter對平臺上的可用內容,例如字體;

Fonts

  Flutter應用程序可能默認爲目標平臺標準的字體,但在桌面上不可用。例如,若是目標平臺是TargetPlatform.iOS,那麼Material庫將默認爲San Francisco,它能夠在macOS上使用,但不能在LinuxWindows上使用。

  大多數應用程序須要基於主機平臺設置字體(例如,經過ThemeData),或者設置與應用程序捆綁在一塊兒的特定字體。若是沒有額外的字體規範(例如,DEBUG橫幅的文本),其餘不使用ThemeData的小部件可能沒法顯示。

Tools

  運行flutter doctor,並確保沒有報告與平臺相關的部分的問題。

  doctorWindowsLinux的支持即將推出; 要求是:

  • Linux:Make,以及最新版本的clang
  • Windows:Visual Studio 20172019,包括Desktop development with C++

運行git倉庫的項目

Example

  設置好全部內容後只需在示例目錄中運行桌面Flutter應用程序;

注意:目前只有調試模式可用。 使用--release運行會成功,但結果仍然是使用調試Flutter配置:asserts將觸發等等。

IDEs

  若是要使用IDE在桌面上運行Flutter項目,則須要爲IDE設置ENABLE_FLUTTER_DESKTOP

  • VS Code: 在VS Code settings.json中添加dart.env:
    "dart.env": {
      "ENABLE_FLUTTER_DESKTOP": true,
    }
    複製代碼
  • IntelliJ / Android Studio:須要使用操做系統的常規過程爲應用程序設置環境變量。 若是設備菜單將開發機器列爲設備,該變量就已正確設置。
相關文章
相關標籤/搜索