Flutter事件监听插件arena_listener的使用

Flutter事件监听插件arena_listener的使用

GestureDetector 对你来说太高阶了吗? 希望有一个类似于 Listener 的东西,可以与 GestureDetectors 在手势竞技场中竞争? 那么这个包正是为你准备的!

特性

  • 监听指针事件,就像一个 Listener
  • 读取指针的手势处置(接受、拒绝、未解决)。
  • 尝试解决竞技场(声明胜利或承认失败),或者保持竞技场未解决。
  • 当指针赢得或输掉竞技场时获得通知。

使用

import 'package:arena_listener/arena_listener.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(const App());
}

class App extends StatelessWidget {
  const App({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return ArenaListener(
      onPointerDown: (PointerDownEvent event) {
        print("${event.pointer} down");
        return null;
      },
      onPointerMove: (PointerMoveEvent event, GestureDisposition? disposition) {
        print("${event.pointer} move, $disposition");
        return null;
      },
      onPointerUp: (PointerUpEvent event, GestureDisposition? disposition) {
        print("${event.pointer} up, $disposition");
        return GestureDisposition.accepted;
      },
      onPointerCancel: (PointerCancelEvent event, GestureDisposition? disposition) {
        print("${event.pointer} cancel, $disposition");
        return GestureDisposition.rejected;
      },
      onWin: (PointerEvent lastEvent) {
        print("${lastEvent.pointer} won");
      },
      onLose: (PointerEvent lastEvent) {
        print("${lastEvent.pointer} lost");
      },
      child: GestureDetector(
        onVerticalDragUpdate: (_) {},
        child: Container(
          color: Colors.grey,
        ),
      ),
    );
  }
}

注意,如果竞技场已经解决了,你返回的手势处置不会改变任何事情。只有在竞技场未解决的情况下,声明胜利或承认失败才有效。

编译并运行 example/ 文件夹中的示例以获得更直观的演示。

你也可以直接使用 RawGestureRecognizerRawGestureDetector,如果 ArenaListener 不适合你的场景。查看 ArenaListener 的源码。

完整示例

以下是完整的示例代码,展示了如何使用 ArenaListener 来处理指针事件:

import 'dart:ui';

import 'package:arena_listener/arena_listener.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(const App());
}

class PointData {
  Offset offset;
  Color color;

  PointData(this.offset, this.color);
}

List<PointData> points = [];

class App extends StatefulWidget {
  const App({super.key});

  [@override](/user/override)
  State<App> createState() => _AppState();
}

class _AppState extends State<App> {
  void addPoint(Offset offset, GestureDisposition? disposition) {
    Color color;
    switch (disposition) {
      case null:
        color = Colors.black;
      case GestureDisposition.accepted:
        color = Colors.red;
      case GestureDisposition.rejected:
        color = Colors.green;
    }

    setState(() {
      points.add(PointData(offset, color));
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      scrollBehavior: const MaterialScrollBehavior().copyWith(
        dragDevices: {
          PointerDeviceKind.mouse,
          PointerDeviceKind.touch,
          PointerDeviceKind.stylus,
          PointerDeviceKind.unknown
        },
      ),
      home: ArenaListener(
        onPointerDown: (event) {
          addPoint(event.localPosition, null);
          return null;
        },
        onPointerMove: (event, GestureDisposition? disposition) {
          addPoint(event.localPosition, disposition);
          return null;
        },
        onPointerUp: (event, GestureDisposition? disposition) {
          addPoint(event.localPosition, disposition);
          return GestureDisposition.accepted;
        },
        onWin: (event) {
          addPoint(event.localPosition, GestureDisposition.accepted);
        },
        onLose: (event) {
          addPoint(event.localPosition, GestureDisposition.rejected);
        },
        child: CustomPaint(
          painter: PointPainter(),
          child: ListView.builder(
            itemBuilder: (context, i) {
              return Text("$i");
            },
          ),
        ),
      ),
    );
  }
}

class PointPainter extends CustomPainter {
  [@override](/user/override)
  void paint(Canvas canvas, Size size) {
    canvas.drawPaint(Paint()..color = Colors.white);

    for (final point in points) {
      canvas.drawPoints(
        PointMode.points,
        [point.offset],
        Paint()
          ..color = point.color
          ..strokeWidth = 10,
      );
    }
  }

  [@override](/user/override)
  bool shouldRepaint(CustomPainter oldDelegate) => true;
}

更多关于Flutter事件监听插件arena_listener的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter事件监听插件arena_listener的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


arena_listener 是一个用于在 Flutter 中监听事件的插件。它允许你在应用程序中监听各种事件,例如手势事件、生命周期事件等。通过使用 arena_listener,你可以更灵活地处理用户交互和应用程序状态的变化。

安装 arena_listener

首先,你需要在 pubspec.yaml 文件中添加 arena_listener 依赖:

dependencies:
  flutter:
    sdk: flutter
  arena_listener: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来安装依赖。

使用 arena_listener

arena_listener 提供了多种监听器,以下是一些常见的使用场景:

1. 监听手势事件

你可以使用 GestureArenaListener 来监听手势事件,例如点击、拖动等。

import 'package:flutter/material.dart';
import 'package:arena_listener/arena_listener.dart';

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Arena Listener Example'),
        ),
        body: Center(
          child: GestureArenaListener(
            onTap: () {
              print('Tap detected!');
            },
            onDoubleTap: () {
              print('Double tap detected!');
            },
            onLongPress: () {
              print('Long press detected!');
            },
            child: Container(
              width: 100,
              height: 100,
              color: Colors.blue,
              child: Center(
                child: Text('Tap me'),
              ),
            ),
          ),
        ),
      ),
    );
  }
}

void main() => runApp(MyApp());

2. 监听生命周期事件

你可以使用 LifecycleArenaListener 来监听应用程序的生命周期事件,例如应用程序进入后台或回到前台。

import 'package:flutter/material.dart';
import 'package:arena_listener/arena_listener.dart';

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Arena Listener Example'),
        ),
        body: LifecycleArenaListener(
          onResume: () {
            print('App resumed');
          },
          onPause: () {
            print('App paused');
          },
          onInactive: () {
            print('App inactive');
          },
          onDetached: () {
            print('App detached');
          },
          child: Center(
            child: Text('Lifecycle Listener'),
          ),
        ),
      ),
    );
  }
}

void main() => runApp(MyApp());

3. 自定义事件监听器

arena_listener 还允许你创建自定义的事件监听器。你可以通过继承 ArenaListener 类来实现自定义的监听逻辑。

import 'package:flutter/material.dart';
import 'package:arena_listener/arena_listener.dart';

class CustomArenaListener extends ArenaListener {
  CustomArenaListener({
    required Widget child,
    required this.onCustomEvent,
  }) : super(child: child);

  final VoidCallback onCustomEvent;

  [@override](/user/override)
  void handleEvent(PointerEvent event) {
    super.handleEvent(event);
    if (event is PointerDownEvent) {
      onCustomEvent();
    }
  }
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Arena Listener Example'),
        ),
        body: Center(
          child: CustomArenaListener(
            onCustomEvent: () {
              print('Custom event detected!');
            },
            child: Container(
              width: 100,
              height: 100,
              color: Colors.green,
              child: Center(
                child: Text('Custom Listener'),
              ),
            ),
          ),
        ),
      ),
    );
  }
}

void main() => runApp(MyApp());
回到顶部