3、Flutter Multiplatform - desktop;

Melrose發表於2019-06-08

Flutter for Desktop

  Flutter for Desktop最初是為了開發FlutterWindowsmacOSLinux嵌入而建立的專案,這項工作後來成為Flutter的一部分。而此專案現在只是在當前狀態下使用這些庫構建Flutter應用程式的示例和測試環境,它還包括一些實驗性的早期桌面外掛。

  Flutter for Desktop仍處於早期階段。 此專案的程式碼並不穩定,並且也不適合生產使用

桌面shell

  Flutter team正在開展以擴充套件Flutter支援桌面應該作為目標的工作,允許開發人員使用Flutter建立macOSWindowsLinux應用程式。

  從長遠來看,將建立一個完全整合的解決方案,用於桌面平臺的Flutter建立,Flutter執行和Flutter構建工作,但目前此專案仍在進行中。

當前的狀態

Flutter桌面API仍處於開發的早期階段,如有更改,恕不另行通知。 也不會提供APIABI的向後相容性。 在任何Flutter更新之後,使用這些庫的任何程式碼都需要更新和重新編譯。

macOS

  這是最成熟的桌面平臺(出於各種原因,包括它與已經支援的iOS非常接近)。

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

Windows

  當前的Windows shellGLFW佔位符,以便進行早期實驗。它將在未來被Win32UWP shell替換,允許在應用程式中嵌入Flutter檢視。最終shellAPI與當前實現將完全不同。

Linux

  當前的Linux shellGLFW佔位符,以便進行早期實驗。Flutter team計劃建立一個庫,讓你可以嵌入Flutter,無論是使用GTK +QtwxWidgetsMotif還是其他任意用於應用程式的其他部分的工具包,但還沒有確定一個好的方案。 所以,目前的計劃是支援GTK +,其中新增對其他工具包的支援將非常簡單。最終shellAPI與當前實現將完全不同。

Plugins

  所有平臺都支援編寫外掛,但是,目前很少有外掛實際上具有桌面支援(例如flutter-desktop-embedding專案中的這些外掛)。

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:需要使用作業系統的常規過程為應用程式設定環境變數。 如果裝置選單將開發機器列為裝置,該變數就已正確設定。

相關文章