天天看点

Flutter 桌面应用入门

Flutter以其跨平台和高性能的应用程序而闻名,这些应用程序可以在移动、Web、桌面和嵌入式设备上进行本地编译。Flutter 的桌面支持在相当长的一段时间内处于试验阶段,但是现在你可以在 Flutter 的稳定分支上使用。

在本文中,您将学习设置 Flutter SDK 以在不同的桌面操作系统上构建应用程序,创建简单的桌面应用程序,

在开始之前,请确保满足以下先决条件。

构建 Flutter 桌面应用的先决条件

首先,您应该具备以下条件:

  • 在您的系统上配置的​​Flutter SDK 。​​
  • 支持 Flutter、​​Android Studio​​、​​IntelliJ IDEA​​或​​VS Code​​的 IDE 。

要获得稳定频道上的 Flutter 桌面支持,您应该拥有Flutter 2.5或更高版本。

您可以通过运行以下命令检查您的 Flutter 版本

flutter --version      
Flutter 桌面应用入门

为 macOS 应用程序配置 Flutter

要构建 macOS 应用程序,您应该在系统上安装xcode

如果您运行​

​flutter devices​

​​,您应该会看到​

​macos​

​列为可用设备之一:

Flutter 桌面应用入门

创建一个新的 Flutter 应用

启用要为其构建应用程序的平台后,您只需运行​

​flutter create​

​命令即可生成具有桌面支持的新项目。

使用命令行,运行以下命令

flutter create <project_name>      
替换​

​<project name>​

​​为您要用于项目的名称,例如​

​flutter create flutter_desktop_sample​

​.

现在,使用您喜欢的 IDE 打开项目。

使用 IDE 打开项目后,查看项目中存在的目录。您会注意到,除了​

​android​

​​、​

​ios​

​​和之外​

​web​

​​,您还有一个名为​

​macos​

​​、​

​linux​

​​或的目录​

​windows​

​(取决于您启用的桌面平台)。

Flutter 桌面应用入门

向预先存在的 Flutter 应用程序添加桌面支持

如果您有一个在启用任何桌面平台标志之前创建的现有 Flutter 项目,则默认情况下它不支持桌面。但是您可以轻松地为这些项目添加桌面支持。为此,首先通过运行以下任一命令启用您要支持的平台:

flutter config --enable-macos-desktop
flutter config --enable-linux-desktop
flutter config --enable-windows-desktop
flutter config --enable-windows-uwp-desktop      

然后运行:

flutter create .      

这会将新的桌面平台目录添加到您现有的项目中,以便您可以为其构建。

Flutter 桌面应用入门

如果您只想添加特定的桌面平台,请使用以下命令:

flutter create --platforms=windows,macos,linux .      

在桌面上运行 Flutter 应用

您可以使用 IDE 或从命令行运行 Flutter 应用程序。从您的 IDE 中,选择要在其上运行应用程序的桌面平台,然后启动它。

使用命令行,您可以使用以下命令在桌面上启动应用程序。

在 macOS 上运行

在macOS平台上运行应用程序:

flutter run -d macos      
Flutter 桌面应用入门

在 Linux 上运行

在Linux平台上运行应用程序:

flutter run -d linux      
Flutter 桌面应用入门

在 Windows 上运行

使用 Win32在Windows平台上运行应用程序:

flutter run -d windows      
Flutter 桌面应用入门

要使用UWP运行应用程序,请从命令行使用以下命令:

flutter run -d winuwp      

Windows UWP 应用需要沙盒环境才能运行。以管理员模式打开 PowerShell,然后运行以下命令:

checknetisolation loopbackexempt -is -n=[APP_CONTAINER_NAME]      

返回上一个命令行并按“ Y ”。现在,您将使用 Windows UWP 运行 Flutter 应用程序。

为桌面应用程序构建布局

与移动应用程序的布局相比,桌面应用程序的布局可能有点难以构建。如果您希望您的 Flutter 应用程序感觉像一个原生桌面应用程序,那么您应该牢记一些重要的点。

响应式布局

由于桌面应用程序可以调整大小,因此您应该尝试使用响应式布局,以便小部件适应每个屏幕尺寸。如果您正确实现了响应式布局,它应该可以防止在您的应用中调整屏幕大小时出现任何溢出问题。

在本文中,我们不会介绍构建响应式布局的概念。

限制窗口大小

尝试缩小使用 Flutter 创建的默认桌面应用程序的窗口大小。您会注意到该应用程序没有最小窗口大小,即可以将窗口压缩到您想要的任意小。

即可以将窗口压缩到您想要的任意小。

Flutter 桌面应用入门

这将导致当前布局内的小部件被挤压,从而导致溢出错误:

Flutter 桌面应用入门

如果您将其与本机桌面应用程序进行比较,您会注意到有一个最小屏幕宽度和高度,超出该范围您无法缩小窗口。例如,下面的演示展示了当您尝试缩小 macOS 应用程序窗口时会发生什么:

为了解决这个问题,您可以使用​​desktop_window​​,因此将其添加到您的​

​pubspec.yaml​

​文件中,如下所示:

flutter pub add desktop_window      
dependencies:
  desktop_window: ^0.4.0      

然后进行对应的设置

Flutter 桌面应用入门

工具提示可见性

默认情况下,当您将鼠标悬停在应用程序内的可点击小部件上时,在桌面上运行的 Flutter 应用程序会显示一个工具提示。通常,工具提示是一种辅助功能,在大多数本机桌面应用程序上都没有启用(或者仅在您将鼠标悬停在某个组件上较长时间后才会出现)。

Flutter 桌面应用入门

在桌面上运行的 Flutter 应用程序上一直弹出工具提示可能非常烦人。幸运的是,有一种方法可以禁用 Flutter 中的工具提示。

​MaterialApp​

​​您可以使用小部件包装整个内容,​

​TooltipVisibility​

​​并将可见性设置为​

​false​

​禁用应用程序中所有小部件的工具提示。

TooltipVisibility(
  visible: false, // disables tooltip
  child: MaterialApp(
    title: 'Flutter Demo',
    theme: ThemeData(
      primarySwatch: Colors.blue,
    ),
    home: const MyHomePage(),
  ),
)      
Flutter 桌面应用入门

键盘输入

如果你想在 Flutter 桌面应用中使用键盘快捷键,有两种方法:

  • 使用​

    ​RawKeyboardListener​

    ​小部件
  • 使用​

    ​FocusableActionDetector​

    ​小部件

​​RawKeyboardListener​​小部件的最大限制是它只能监听键盘上单个键的按下和按下事件。 这意味着您将无法使用组合键来触发任何功能。

处理键盘输入的更优雅的方法是使用​​FocusableActionDetector​​小部件。使用此小部件,您还可以轻松处理组合键(一次最多四个键)。

让我们看看如何在 Flutter 的入门应用(计数器应用)中实现键绑定。

Flutter 桌面应用入门
我通过添加第二个减少计数器值的按钮对计数器应用程序进行了小修改。

首先,定义要用于递增和递减计数器值的组合键。全局定义以下变量:

final incrementKeys = LogicalKeySet(
  Platform.isMacOS ? LogicalKeyboardKey.meta : LogicalKeyboardKey.control,
  LogicalKeyboardKey.equal,
);

final decrementKeys = LogicalKeySet(
  Platform.isMacOS ? LogicalKeyboardKey.meta : LogicalKeyboardKey.control,
  LogicalKeyboardKey.minus,
);      
这里,​

​meta​

​​实际上是​

​command​

​​macOS 上的关键。当它在 Windows 或 Linux 上运行时,将​

​control​

​使用密钥代替它。

在 macOS 上,上述键盘组合键指的是以下内容:

Flutter 桌面应用入门

接下来,定义两个 Intent:

class IncrementIntent extends Intent {}

class DecrementIntent extends Intent {}      

在 Flutter 中,​​Intent​​是一个绑定到​​Action​​的对象,它有助于根据键盘组合键触发更新应用程序的状态。

你必须为这些 Intent(s) 配置一个监听器:

class KeyBinding extends StatelessWidget {
  const KeyBinding({
    Key? key,
    required this.child,
    required this.onIncrementTriggered,
    required this.onDecrementTriggered,
  }) : super(key: key);

  final Widget child;
  final VoidCallback? onIncrementTriggered;
  final VoidCallback? onDecrementTriggered;

  @override
  Widget build(BuildContext context) {
    return FocusableActionDetector(
      autofocus: true,
      shortcuts: {
        incrementKeys: IncrementIntent(),
        decrementKeys: DecrementIntent(),
      },
      actions: {
        IncrementIntent: CallbackAction(
          onInvoke: (e) => onIncrementTriggered?.call(),
        ),
        DecrementIntent: CallbackAction(
          onInvoke: (e) => onDecrementTriggered?.call(),
        ),
      },
      child: child,
    );
  }
}      

在上面的类中,有两个基于组合键触发的回调,​

​FocusableActionDetector​

​小部件有助于相应地更新应用程序状态。

现在,您可以​

​Scaffold​

​​使用小部件包装计数器应用程序屏幕​

​KeyBinding​

​:

KeyBinding(
  onIncrementTriggered: _incrementCounter,
  onDecrementTriggered: _decrementCounter,
  child: Scaffold(
    appBar: AppBar(
        title: Text(widget.title),
    ),
    body: Center(),
  ),
)      
Flutter 桌面应用入门

在 Codemagic 上构建的配置

可以使用​​Workflow Editor​​或​​codemagic.yaml​​文件在 Codemagic 上构建 Flutter 应用程序。Codemagic 目前支持为macOS、Linux和Windows平台构建 Flutter 桌面应用程序。

在开始构建配置之前,请将您的项目添加到 Codemagic。

添加新项目

您的项目应该存在于使用版本控制系统的代码托管平台如​​GitHub​​上

请按照以下步骤添加您的项目:

  1. 登录到​​Codemagic​​。如果您是新用户,请注册:

​​注册​​

  1. 在应用程序页面上,单击添加应用程序:
  2. 选择您要使用的Git 提供程序(如果您要使用存储库的克隆 URL 添加,请选择其他):
  3. 单击下一步:授权集成以授权 Codemagic。如果您已经授权您选择的 Git 提供程序,请单击下一步:选择存储库。
如果您使用GitHub作为您的 Git 提供程序,那么在选择存储库之前还需要执行一个额外步骤:单击安装 GitHub 应用程序以设置集成。​​在此处​​了解有关配置 GitHub 应用程序集成的更多信息。
  1. 现在,选择您的存储库(如果使用其他,则添加克隆 URL)和项目类型。然后,单击完成:添加应用程序:
  2. 您将被带到项目设置。工作流编辑器选项卡将默认选中。

使用工作流编辑器进行配置

Codemagic默认选择Android和iOS平台。 要为 macOS 或 Linux 平台构建应用程序,您必须选择相应的选项。您还需要相应地更改 VM,因为 macOS 应用程序只能使用 macOS 和 Linux 应用程序使用 Linux 构建。

为 Linux 平台构建:

  1. 在Build for platform下选择Linux。
  2. 将 VM 实例更改为Linux Standard VM或Linux Premium VM。
  3. 转到构建选项卡。从这里,您可以设置Flutter 版本和 Linux 应用构建模式(如Debug、Release或Profile)。
  4. 如果您想构建应用程序以发布到​​Snap Store ,请按照​​​​此处​​的步骤操作。

为 macOS 平台构建:

  1. 在Build for platforms下选择macOS。
  2. 将 VM 实例更改为macOS Standard VM或macOS Premium VM。
  3. 转到构建选项卡。从这里,您可以设置Flutter、Xcode和CocoaPods 版本。指定 macOS 应用程序构建模式(如Debug、Release或Profile)。
​​在此处​​了解有关为 macOS 应用程序生成发布版本并将其发布到 Mac App Store 的更多信息。

使用 Codemagic YAML 进行配置

​codemagic.yaml​

​或者,您可以使用该文件在 Codemagic 上构建您的桌面应用程序。请按照以下步骤操作:

  1. 在 Codemagic 上,单击切换到 YAML 配置以使用 YAML 文件。
  2. ​codemagic.yaml​

    ​返回到您的 Flutter 项目,并在项目的根目录中创建一个名为的新文件。
  3. 将以下模板添加到文件中:
workflows:
  my-workflow:
    name: Workflow name
    instance_type: mac_mini
    max_build_duration: 60
    environment:
      groups:
        - ...
      flutter: stable
    cache:
      cache_paths:
        - ~/.pub-cache
    scripts:
      - ...
    artifacts:
      - ...
    publishing:
      email:
        recipients:
          - [email protected]      

这是在 Codemagic 上构建应用程序的基本工作流模板。查看​​文档​​以获取更多信息。

以下是如何修改工作流模板以构建适用于Linux平台的 Flutter 应用程序:

  1. 设置适当的工作流名称,并定义 Linux VM 实例:
workflows:
  linux-workflow:
    name: Linux workflow
    instance_type: linux
    max_build_duration: 60      
  1. 将 Flutter 版本设置为master下​

    ​environment​

    ​:
environment:
  flutter: master      
  1. 在该​

    ​scripts​

    ​部分下,首先获取 Flutter 依赖项:
scripts:
  - name: Get Flutter packages
    script: flutter packages pub get      
  1. 启用 Linux 平台:
- name: Configure for Linux
  script: |
        flutter config --enable-linux-desktop      
  1. 为 Linux 平台构建:
- name: Build Linux
  script: flutter build linux      
  1. 导出生成的 Linux 构建工件:
- name: Export bundle
  script: cp -r build/linux/x64/release/bundle $CM_EXPORT_DIR/bundle      
  1. 使用它们的路径检索生成的工件:
artifacts:
  - build/linux/**/*.zip
  - flutter_drive.log      

按照以下步骤修改工作流模板以构建适用于macOS平台的 Flutter 应用:

  1. 设置适当的工作流名称,并定义一个 macOS VM 实例:
workflows:
  macos-workflow:
    name: macOS workflow
    instance_type: mac_mini
    max_build_duration: 60      
  1. 在以下位置设置 Flutter、Xcode 和 CocoaPods 版本​

    ​environment​

    ​:
environment:
  flutter: master
  xcode: latest
  cocoapods: default      
  1. 在该​

    ​scripts​

    ​部分下,首先获取 Flutter 依赖项:
scripts:
  - name: Get Flutter packages
    script: flutter packages pub get      
  1. 启用 macOS 平台,并安装 Podfile:
- name: Configure for macOS
  script: |
    flutter config --enable-macos-desktop
    find . -name "Podfile" -execdir pod install ;      
  1. 初始化钥匙串:
- name: Set up keychain
  script: keychain initialize      
  1. 要执行代码签名过程,您必须将 API 密钥和一些相关的机密文件作为环境变量添加到 Codemagic。转到Codemagic 上项目的环境变量选项卡。

    为自动代码签名添加以下变量:

  • ​APP_STORE_CONNECT_KEY_IDENTIFIER​

  • ​APP_STORE_CONNECT_ISSUER_ID​

  • ​APP_STORE_CONNECT_PRIVATE_KEY​

  • ​CERTIFICATE_PRIVATE_KEY​

为手动代码签名添加以下变量:

  • ​CM_CERTIFICATE​

  • ​CM_CERTIFICATE_PASSWORD​

  • ​CM_PROVISIONING_PROFILE​

要了解有关如何生成这些变量的更多信息,请访问​​此处​​的文档。
  1. 在 YAML 文件中添加环境变量组名称:
environment:
  groups:
    - macos-signing      
  1. 对于自动代码签名,添加以下脚本:
- name: Fetch Mac App Distribution certificate and Mac App Store profile
  script: |
    app-store-connect fetch-signing-files \
      "io.codemagic.app" \
      --platform MAC_OS \
      --type MAC_APP_STORE \
      --create          
- name: Fetch Mac Installer Distribution certificates
  script: |
    app-store-connect create-certificate --type MAC_INSTALLER_DISTRIBUTION --save || \
      app-store-connect list-certificates --type MAC_INSTALLER_DISTRIBUTION --save          
- name: Set up signing certificate
  script: keychain add-certificates      

对于手动代码签名,添加以下内容:

- name: Set up provisioning profile
  script: |
    PROFILES_HOME="$HOME/Library/MobileDevice/Provisioning Profiles"
    mkdir -p "$PROFILES_HOME"
    PROFILE_PATH="$(mktemp "$PROFILES_HOME"/$(uuidgen).mobileprovision)"
    echo ${CM_PROVISIONING_PROFILE} | base64 --decode > "$PROFILE_PATH"
    echo "Saved provisioning profile $PROFILE_PATH"              
- name: Set up signing certificate
  script: |
    echo $CM_CERTIFICATE | base64 --decode > /tmp/certificate.p12
    if [ -z ${CM_CERTIFICATE_PASSWORD+x} ]; then
      # when using a certificate that is not password-protected
      keychain add-certificates --certificate /tmp/certificate.p12
    else
      # when using a password-protected certificate
      keychain add-certificates --certificate /tmp/certificate.p12 --certificate-password $CM_CERTIFICATE_PASSWORD
    fi      
  1. 使用项目的代码签名:
- name: Set up code signing
  script: xcode-project use-profiles      
  1. 构建 macOS 应用程序:
- name: Build macOS
  script: flutter build macos      
  1. 使用它们的路径检索生成的构建工件:
artifacts:
  - build/macos/**/*.app
  - flutter_drive.log      

开始在 Codemagic 上构建

要开始您的第一个构建:

  1. 从Codemagic 上的应用程序仪表板转到您的项目。
  2. 单击开始新构建。
  3. 选择正确的工作流程,然后单击Start new build。

恭喜

  • Linux 应用程序: Snapcraft Snap Store(​​工作流编辑器​​​或​​Codemagic YAML​​)
  • macOS 应用程序: App Store Connect(​​工作流编辑器​​​或​​Codemagic YAML​​)