使用 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));