| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 | import 'package:flutter/services.dart';import 'package:flutter/material.dart';import 'dart:io' show Platform;class CocoaWindowChannel {  CocoaWindowChannel._();  final MethodChannel _channel = const MethodChannel("flutter/cocoaWindow");  static final CocoaWindowChannel instance = CocoaWindowChannel._();  Future<void> setWindowPosition(Offset offset) async {    await _channel.invokeMethod("setWindowPosition", [offset.dx, offset.dy]);  }  Future<List<double>> getWindowPosition() async {    final raw = await _channel.invokeMethod("getWindowPosition");    final arr = raw as List<dynamic>;    final List<double> result = arr.map((s) => s as double).toList();    return result;  }  Future<void> zoom() async {    await _channel.invokeMethod("zoom");  }}class MoveWindowDetector extends StatefulWidget {  const MoveWindowDetector({Key? key, this.child}) : super(key: key);  final Widget? child;  @override  _MoveWindowDetectorState createState() => _MoveWindowDetectorState();}class _MoveWindowDetectorState extends State<MoveWindowDetector> {  double winX = 0;  double winY = 0;  @override  Widget build(BuildContext context) {    if (!Platform.isMacOS) {      return widget.child ?? Container();    }    return GestureDetector(      // https://stackoverflow.com/questions/52965799/flutter-gesturedetector-not-working-with-containers-in-stack      behavior: HitTestBehavior.translucent,      onDoubleTap: () async {        await CocoaWindowChannel.instance.zoom();      },      onPanStart: (DragStartDetails details) {        winX = details.globalPosition.dx;        winY = details.globalPosition.dy;      },      onPanUpdate: (DragUpdateDetails details) async {        final windowPos = await CocoaWindowChannel.instance.getWindowPosition();        final double dx = windowPos[0];        final double dy = windowPos[1];        final deltaX = details.globalPosition.dx - winX;        final deltaY = details.globalPosition.dy - winY;        await CocoaWindowChannel.instance.setWindowPosition(Offset(dx + deltaX, dy - deltaY));      },      child: widget.child,    );  }}
 |