Flutter Desktop MacOS创建 flutter plugin 插件

15 min read

使用 AS 创建 flutter plugin模块

目录结构如下

tree mac_orc

math_desktop
├── LICENSE
├── lib
│   └── example_plugin.dart
├── linux
│   ├── Makefile
│   ├── example_plugin.cc
│   └── example_plugin.h
├── macos
│   ├── Classes
│   │   └── ExamplePlugin.swift
│   └── example_plugin.podspec
├── pubspec.yaml
└── windows
    ├── ExamplePlugin.vcxproj
    ├── ExamplePlugin.vcxproj.filters
    ├── example_plugin.cpp
    ├── example_plugin.h
    └── scripts
        └── cache_flutter.bat

插件类路径 macos/Classes/MacOrcPlugin.swift

import Cocoa
import FlutterMacOS

public class MacOrcPlugin: NSObject, FlutterPlugin {
    public static func register(with registrar: FlutterPluginRegistrar) {
        let channel = FlutterMethodChannel(name: "mac_orc", binaryMessenger: registrar.messenger)
        let instance = MacOrcPlugin()
        registrar.addMethodCallDelegate(instance, channel: channel)
    }

    public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
        switch call.method {
        case "isAccessAllowed":
            isAccessAllowed(call, result: result)
            break
        case "requestAccess":
            requestAccess(call, result: result)
            break
        default:
            result(FlutterMethodNotImplemented)
        }
    }

    public func isAccessAllowed(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
        if #available(macOS 10.16, *) {
            result(CGPreflightScreenCaptureAccess())
            return
        };
        result(true)
    }

    public func requestAccess(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
        let args:[String: Any] = call.arguments as! [String: Any]
        let onlyOpenPrefPane: Bool = args["onlyOpenPrefPane"] as! Bool

        if (!onlyOpenPrefPane) {
            if #available(macOS 10.16, *) {
                CGRequestScreenCaptureAccess()
            } else {
                // Fallback on earlier versions
            }
        } else {
            let prefpaneUrl = URL(string: "x-apple.systempreferences:com.apple.preference.security?Privacy_ScreenCapture")!
            NSWorkspace.shared.open(prefpaneUrl)
        }
        result(true)
    }

}

在项目中增加插件

dependencies:
  flutter:
    sdk: flutter

  cupertino_icons: ^0.1.0
  mac_orc:
    path: ../mac_orc

插件描述文件路径补充完后执行 flutter pub get添加插件

安装插件

在项目文件 mac文件夹中执行,安装插件

pod install

在Flutte中通过MethodChannel调用插件

const MethodChannel _channel = MethodChannel('mac_orc');

_channel
    .invokeMethod('requestAccess', arguments)
    .then((value) => print(value));