Skip to content

Instantly share code, notes, and snippets.

@peleteiro
Created June 15, 2021 14:29
Show Gist options
  • Save peleteiro/be35fdb1effb0320b1ab885d1c4d35f1 to your computer and use it in GitHub Desktop.
Save peleteiro/be35fdb1effb0320b1ab885d1c4d35f1 to your computer and use it in GitHub Desktop.
import 'package:flutter/material.dart';
import 'package:collection/collection.dart';
import 'package:rxdart/rxdart.dart';
import 'package:simple_gesture_detector/simple_gesture_detector.dart';
enum _Kode { left, right, tap, longPress }
const List<_Kode> _konamiCode = [_Kode.left, _Kode.right, _Kode.left, _Kode.right, _Kode.tap, _Kode.longPress];
class KonamiCodeTrigger extends StatefulWidget {
final VoidCallback action;
final Widget child;
KonamiCodeTrigger({required this.action, required this.child});
@override
_KonamiCodeTriggerState createState() => _KonamiCodeTriggerState();
}
class _KonamiCodeTriggerState extends State<KonamiCodeTrigger> {
ReplaySubject<_Kode> codes = ReplaySubject(maxSize: _konamiCode.length);
_KonamiCodeTriggerState() {
codes //
.bufferCount(_konamiCode.length, 1)
.where((actualCode) => const IterableEquality<_Kode>().equals(actualCode, _konamiCode))
.listen((_) => widget.action());
}
@override
Widget build(BuildContext context) {
return SimpleGestureDetector(
onHorizontalSwipe: (d) => d == SwipeDirection.left ? codes.add(_Kode.left) : codes.add(_Kode.right),
onTap: () => codes.add(_Kode.tap),
onLongPress: () => codes.add(_Kode.longPress),
child: widget.child,
);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment