如何使用 Flutter 创建桌面应用程序【Flutter 专题 1】

简介: 桌面应用程序在具有各种 UI 元素的系统窗口内运行。如果您要制作桌面应用程序,有多种不同的框架、UI 工具包和编程语言可供选择。有两种类型的桌面应用程序开发 API:特定于平台的和跨平台的。特定于平台的 API 仅支持一种目标操作系统。例如,Cocoa API 提供了用于为 macOS 平台开发桌面应用程序的接口。另一方面,跨平台 API 允许开发人员使用单个通用 API 为多个操作系统制作桌面应用程序。

引言

开发人员可以选择编写多种类型的应用程序:控制台应用程序、移动应用程序、Web 应用程序和桌面应用程序。


桌面应用程序在具有各种 UI 元素的系统窗口内运行。如果您要制作桌面应用程序,有多种不同的框架、UI 工具包和编程语言可供选择。


有两种类型的桌面应用程序开发 API:特定于平台的和跨平台的。特定于平台的 API 仅支持一种目标操作系统。例如,Cocoa API 提供了用于为 macOS 平台开发桌面应用程序的接口。另一方面,跨平台 API 允许开发人员使用单个通用 API 为多个操作系统制作桌面应用程序。


如今,跨平台开发框架流行的原因如下:


  • 开发人员可以为多个平台维护一个单一的代码库,因为跨平台框架的 API 为特定于平台的 API 提供了很好的抽象
  • 快速功能交付,意味着无需通过编写特定于平台的代码为不同的操作系统实现相同的功能,因此可以有效地交付新功能


在本文中,我将解释如何使用 Flutter 创建、构建和发布原生跨平台桌面应用程序。我们还将讨论 Flutter 受欢迎的原因。

什么是 Flutter?

Flutter 是一个跨平台的应用程序开发框架,我们可以使用它为多个平台构建本地编译的应用程序:移动、桌面和 Web。


已知支持的输出目标是 Android、iOS、HTML、HTML Canvas、Linux、Windows、macOS 和 Fushia。Flutter 使用 Dart 作为应用程序开发语言。


Flutter 目前更专注于移动应用程序开发,但也支持基于桌面的目标。


该框架带有自己的小部件工具包。当特定的 Flutter 应用程序启动时,Flutter 将通过Skia 图形库呈现应用程序的 UI 控件。

为什么 Flutter 如此受欢迎?

在跨平台框架开发领域,最关键的问题是如何放置所有平台的抽象层。换句话说,如何为开发人员提供通用 API 而不会给应用程序带来性能问题。


Electron 等桌面应用程序开发框架引入了用于渲染的 Web 浏览器。Apache Cordova 和 Ionic 移动应用程序开发框架以同样的方式解决了这个问题。尽管这些框架为开发人员提供了简单的跨平台 API,但由于基于 Web 浏览器的渲染,仍存在严重的性能问题。


Flutter 通过 Dart 库提供简单的跨平台 API,同时还保持卓越的性能。

使用 Flutter 开发桌面应用程序

在本教程中,我将展示如何使用 Flutter 制作一个简单的跨平台桌面应用程序。

搭建 Flutter 开发环境

安装 Flutter 是小菜一碟,因为它就是输入一些终端命令。


具体看我前面的文章介绍


之后,我们需要启用桌面开发模式:


flutter config --enable-<platform>-desktop// <平台> = linux、windows、macos

复制代码


如果启用了桌面模式,该flutter devices命令应列出您当前的操作系统。


image.png

创建一个新的 Flutter 应用

像任何其他典型的 CLI 一样,我们可以使用create如下所示的命令创建一个新应用程序:


flutter create desktop-app

复制代码


上面的命令将为我们搭建一个简单的入门项目。入门项目包含最少的代码和注释,以帮助我们了解 Flutter 的工作原理。


lib/main.dart文件包含应用程序的主要源代码。让我们修改如下所示的主要源代码以创建一个简单的“Hello World”应用程序:


import 'package:flutter/material.dart';
void main() {
  runApp(MyApp());
}
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'TextPad',
      theme: ThemeData(
        primarySwatch: Colors.green,
      ),
      home: Scaffold(
        body: Center(
          child: Text('Hello World')
        ),
      ),
    );
  }
}

复制代码


编辑源文件后,输入以下命令来运行您的应用程序:


flutter run -d <platform>
// <platform> = linux, windows, macos

复制代码


上述命令将在原生窗口中打开 Flutter “Hello World” 应用程序。本机窗口将根据当前操作系统和系统主题配置进行样式设置。


image.png

调试 Flutter 应用

Flutter 开发环境支持热重载功能。因此,我们可以r在您输入flutter run命令的控制台中按键来触发热重载。当应用程序在调试模式下运行时,尝试更改文本小部件的内容。

实现跨平台桌面应用程序

让我们用 Flutter 实现一个小的跨平台桌面应用程序。我们将制作一个名为“TextPad”的小型文本编辑器应用程序。TextPad 有一个大的多行文本字段,我们可以在其中输入我们的笔记。它还有一个操作按钮,可以将当前笔记保存到文件中。TextPad 的屏幕截图如下所示。


image.png


如上所述,右上角的保存按钮会将当前笔记写入文本文件。保存文件后,TextPad 将显示有关任务完成的通知消息。


image.png


与之前的 Hello-World 应用程序类似,将以下源代码添加到主应用程序源文件中:


import 'dart:io';
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
    final textController = new TextEditingController();
    final globalKey = GlobalKey<ScaffoldState>();
    final String fileName = 'textPadNote.txt';
     Future<void> _exportToFile(BuildContext context) async {
       final File file = File('${Directory.current.absolute.path}/${fileName}');
       final snackBar = SnackBar(content: Text('Saved to: ${file.path}'));
       await file.writeAsString(textController.text);
       globalKey.currentState.showSnackBar(snackBar);
    }
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'TextPad',
      theme: ThemeData(
                brightness: Brightness.dark,
           ),
      home: Scaffold(
        key: globalKey,
        appBar: AppBar(
          title: Text('TextPad'),
          actions: <Widget>[
              IconButton(
                    icon: const Icon(Icons.save),
                    tooltip: 'Export to ${fileName}',
                    onPressed: () {_exportToFile(context);}
                  )]
        ),
        body: Center(
          child: TextField(
                controller: textController,
                maxLines: null,
                keyboardType: TextInputType.multiline,
                expands: true,
                  decoration: InputDecoration(
    hintText: 'Play with your notes here...',
    contentPadding: EdgeInsets.all(12.0)
  ),
          ),
        ),
      ),
    );
  }
}

复制代码

使用可移植的二进制文件构建您的 Flutter 桌面应用程序

在将您的应用程序发布到 Internet 之前,您可以构建 Flutter 应用程序以获取可移植的二进制文件。这些二进制文件也可以与用户或测试人员共享。此外,您可以使用自己喜欢的安装程序工具制作可安装的二进制文件。


当我们调试应用程序时,将创建可调试的二进制文件。但是,可调试的二进制文件并未针对某个版本进行优化。在终端上执行以下命令来制作优化的二进制文件:


$ flutter build <platform>// <platform> = linux, windows, macos

复制代码

如何发布您的应用程序

发布 Flutter 应用程序有多种方式,但部署方式取决于操作系统的类型。例如,如果您要为 Linux 用户发布您的应用程序,您可以将您的 Flutter 应用程序部署到Snapcraft软件商店。


如果需要为 Windows 用户部署应用程序,可以借助第三方工具制作 Windows 安装程序包 (MSI) 或新的 Windows 应用程序包 (MSIX)。


或者我在这儿给大家提供一种方法:

flutter 应用发布 windows 版

image.png


我们希望你完成迁移后尽快将其发布,可以作为预览版:


参考文章:https://dart.cn/null-safety/migration-guide


迁移桌面 flutter config --enable-<platform>-desktop


image.png

1.为现有的 Flutter 应用程序添加桌面支持

要将桌面支持添加到现有 Flutter 项目,请从项目根目录在终端中运行以下命令:


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

复制代码


这会将必要的桌面文件和目录添加到您现有的 Flutter 项目中。要仅添加特定桌面平台,请将platforms列表更改为仅包含您要添加的平台。


image.png


可以看到 build 目录下已经有 windows

image.png


注意,你的电脑必须下载 vs

下面我给出下载链接:


https://visualstudio.microsoft.com/zh-hans/thank-you-downloading-visual-studio/?sku=Community&rel=16


2..创建 main_desktop.dart 文件

比如我的 main.dart 文件是这样的


import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:outlook/constants.dart';
import 'package:outlook/screens/main/main_screen.dart';
void main() {
  runApp(MyApp());
}
class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Flutter blog',
      theme: ThemeData(),
      home: MainScreen(),
    );
  }
}

复制代码


那么我的 main_desktop.dart 文件就是这样的


import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:outlook/constants.dart';
import 'package:outlook/screens/main/main_screen.dart';
void main() {
  debugDefaultTargetPlatformOverride = TargetPlatform.fuchsia;//这句话很关键
  runApp(MyApp());
}
class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Flutter blog',
      theme: ThemeData(),
      home: MainScreen(),
    );
  }
}

复制代码


flutter 和 go 都是 google 出品,如何安装做一下不做介绍

3.hover 安装和环境配置

go get -u github.com/go-flutter-desktop/hover



稍等会 hover 就会出现在 go 语言的 SDK 下面的 bin 文件夹下


image.png


你又会发现报错:**exec: "gcc": executable file not found in %PATH%**这是缺少一个环境变量,别急,补上去,https://sourceforge.net/projects/mingw-w64/files/mingw-w64/


image.png


image.png

image.png


安装过程会下载很多东西,都到这一步了,不要放弃,接下来配置环境变量


C:\Program Files (x86)\mingw-w64\i686-6.2.0-posix-sjlj-rt_v5-rev1\mingw32\bin


image.png

4.初始化,并打包

接下来,我们到你的 flutter 项目的目录下面


hover init github.com/my-organization/flutter_bloc_super #前面的地址固定,后面写你项目的名字

复制代码


就会出现一个 go 文件夹


image.png


生成这个文件之后再执行,


hover run



最后一步大功告成


变身!!!!!如图的路径就是打包后生成的 exe 文件,双击执行,就好了。


image.png

坑 1

如果报错 goland 编译报错 cc1.exe: sorry, unimplemented: 64-bit mode not compiled in


主要原因是本地的 cc1.exe 版本不是 64 位的,在 64 位环境下无法编译


请下载这个、https://sourceforge.net/projects/mingw-w64/


image.png

结论

如今,Electron 在桌面应用程序开发中非常流行,因为它允许开发人员使用 Web 技术制作桌面应用程序。然而,由于高物理资源使用率,Electron 应用程序经常成为膨胀软件。Flutter 的性能比 Electron 好,因为它不在 Web 浏览器上执行应用程序的 GUI 逻辑。


Flutter 确实给开发者带来了一些痛点。它带有一种陌生的编程语言和一个全新的小部件工具包。


Flutter 的初始阶段以其令人印象深刻的整体性能和功能给大家留下了深刻的印象。我相信 Flutter 桌面很快就会与 Electron 竞争!


大家喜欢的话,可以关注我,我们一起加油!这篇文章带领大家简单的使用 flutter 创建了第一个桌面,也希望大家看完这篇文章能喜欢 flutter,并尝试用 flutter 制作自己的第一个桌面应用,谢谢大家,我们下期再见!

相关文章
|
5月前
|
前端开发 Linux iOS开发
【Flutter前端技术开发专栏】Flutter在桌面应用(Windows/macOS/Linux)的开发实践
【4月更文挑战第30天】Flutter扩展至桌面应用开发,允许开发者用同一代码库构建Windows、macOS和Linux应用,提高效率并保持平台一致性。创建桌面应用需指定目标平台,如`flutter create -t windows my_desktop_app`。开发中注意UI适配、性能优化、系统交互及测试部署。UI适配利用布局组件和`MediaQuery`,性能优化借助`PerformanceLogging`、`Isolate`和`compute`。
381 0
【Flutter前端技术开发专栏】Flutter在桌面应用(Windows/macOS/Linux)的开发实践
|
5月前
|
Linux 开发者 iOS开发
Flutter笔记:桌面应用 窗口定制库 bitsdojo_window
Flutter笔记:桌面应用 窗口定制库 bitsdojo_window
315 0
|
Dart Linux 开发工具
使用Flutter构建桌面应用:一次开发,多平台支持
随着移动和桌面应用程序的需求不断增长,开发人员需要寻找一种高效的方法来构建多平台的应用程序。Flutter作为一个跨平台的UI框架,提供了一次编写、多平台运行的解决方案。在本文中,我们将探讨如何使用Flutter来构建桌面应用程序,并展示其多平台支持的优势。
1836 0
|
Web App开发 Dart 前端开发
Flutter 第一个程序Hello World!
Flutter 第一个程序Hello World!
270 1
Flutter 第一个程序Hello World!
|
Android开发
【错误记录】Flutter 混合开发报错 ( java.nio.file.FileSystemException: xxx/R.jar: 另一个程序正在使用此文件,进程无法访问。 )
【错误记录】Flutter 混合开发报错 ( java.nio.file.FileSystemException: xxx/R.jar: 另一个程序正在使用此文件,进程无法访问。 )
659 0
【错误记录】Flutter 混合开发报错 ( java.nio.file.FileSystemException: xxx/R.jar: 另一个程序正在使用此文件,进程无法访问。 )
|
Dart 容器
flutter制作具有自定义导航栏的渐进式 Web 应用程序
本文主要介绍具有自定义导航栏的渐进式 Web 应用程序 gitee github 让我们准备我们的 - “Main.dart” 我们将整个页面分成几个部分,以便于制定,我建议您这样做以获得更好的编程,让我们更详细地查看这些部分, NavigationBar()、 DashBoard()、 CalendarSpace(), 首先我们可以做导航栏部分
151 0
|
开发工具 Android开发
Flutter 04: 图解第一个程序遇到的安装依赖问题
      小菜刚开始学习 Flutter 会遇到各种意想不到的问题,今天整理一下第一次新建项目运行时报的错的处理方式。     Finished with error: Please review your Gradle project setup in the android/folder.
2093 0
|
开发工具 Windows Dart
Flutter 03: 图解第一个程序 Hello World!
      无论是学习哪门语言,第一个程序都是 Hello World! 小菜最近在学习 Flutter 因此整理一下在第一个测试 Demo 中遇到的一些问题。
2355 0
|
16天前
|
Android开发 iOS开发 容器
鸿蒙harmonyos next flutter混合开发之开发FFI plugin
鸿蒙harmonyos next flutter混合开发之开发FFI plugin
|
5天前
|
开发者
鸿蒙Flutter实战:07-混合开发
鸿蒙Flutter混合开发支持两种模式:1) 基于har包,便于主项目开发者无需关心Flutter细节,但不支持热重载;2) 基于源码依赖,利于代码维护与热重载,需配置Flutter环境。项目结构包括AppScope、flutter_module等目录,适用于不同开发需求。
19 3