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/
文件夹中的示例以获得更直观的演示。
你也可以直接使用 RawGestureRecognizer
和 RawGestureDetector
,如果 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
更多关于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());