自 2018 年推出第一个稳定版本以来,Flutter 已经发展了很多,包括支持多种平台,例如 Web、Windows、Linux 和 macOS(甚至还支持 Risk V Architectures!)
使用 Flutter 时,您将主要使用 Dart 语言编写代码。这意味着你不能访问原生平台的功能(除非您使用的是 ffigen 或 jnigen)。尽管在 pub.dev 上有很多库,涵盖了访问原生平台功能(Android 存储、连接状态等)方面的大部分需求,但你可能需要一些时间来编写你的特定平台处理一些任务的代码。幸运的是,Flutter 提供了一个 API 来做到这一点。这些称为平台渠道。
要了解有关平台渠道的更多信息,我建议阅读 Invertase 开源工程师 Mais Alheraki 的这篇文章
我最近需要为一个宠物项目编写代码,我发现文档中没有关于如何在 macOS 上执行此操作的资源。因此,在本文中,我们将学习如何为 macOS 应用程序编写特定于平台的代码。
对于本教程,我们将编写一个简单的 macOS 应用程序。该应用程序将显示有关设备电池的信息,例如剩余时间、当前容量以及是否正在充电。
所以首先,我们将创建一个新的 Flutter 应用程序。由于我们仅针对 macOS,因此我们将取消选中其他平台
我们的项目现已创建。接下来,我们将编写代码的 Dart 部分。我们将创建一个 DeviceBatteryChannel 来处理我们对本机 API 的调用:
完整文件:device_battery_channel.dart
这里发生了什么事
我们创建了一个类来处理对本机 API 的调用。在这个类中,我们定义了一个名为 com.stevenosse.battery/device_battery 的 Method Channel。这个类定义了三个方法来有效地处理我们的调用。让我们深入了解我们的第一个方法,getBatteryLevel:
在此方法中,我们从方法通道调用 getBatteryLevel 方法,不带任何参数。
我们的原生代码将用 Swift 编写。
我们完成任务所需的代码是从 StackOverflow 上的这个答案复制和粘贴的。
我们现在将设置我们的方法调用处理程序。为此,我们将重写 AppDelegate 中的 applicationDidFinishLaunching 方法
所以在这里我们实现了我们的方法并启动了我们的方法通道。我们需要实现一个方法调用处理程序(它将处理来自 Dart 代码的调用)。这是我们的 getBatteryLevel 方法的样子:
当收到对 getBatteryLevel 的调用时,我们使用我们的 InternalFinder 类。我们会先检查设备是否有内置电池,然后获取电池的当前电量并返回结果。
此应用程序的完整源代码可在此处获得:https://github.com/stevenosse/battery
我想让本文中的事情变得最简单,以便于理解。然而,我们可以通过使用 Pigeon 来做的更好。 Pigeon 是一个生成器工具,可以使 Flutter 和主机平台之间的通信类型安全、更简单、更快速,它由 Flutter 团队开发。
[1]
ffigen: https://pub.dev/packages/ffigen[2]
jnigen: https://pub.dev/packages/jnigen[3]
平台渠道: https://docs.flutter.dev/development/platform-integration/platform-channels[4]
这篇文章: https://invertase.io/blog/flutter-native-apis-pt1[5]
device_battery_channel.dart: https://github.com/stevenosse/battery/blob/main/lib/src/services/device_battery_channel.dart[6]
这个答案: https://stackoverflow.com/a/57145146/9934529[7]
Pigeon: https://pub.dev/packages/pigeon