Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save folaoluwafemi/c3c518d90f2d9fe3e8982c7dfd8dc6a2 to your computer and use it in GitHub Desktop.
Save folaoluwafemi/c3c518d90f2d9fe3e8982c7dfd8dc6a2 to your computer and use it in GitHub Desktop.
A single child scroll view widget that allows control over the number of pointers that enable scrolling
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
///copied and modified from [stackoverflow](https://stackoverflow.com/questions/76155321/how-can-i-recognize-two-fingers-on-the-screen-in-flutter/76156071?noredirect=1#comment134304616_76156071)
class NPointerSingleChildScrollView extends StatefulWidget {
final int numberOfPointers;
final Axis scrollDirection;
final bool reverse;
final EdgeInsetsGeometry? padding;
final ScrollController? controller;
final bool? primary;
final ScrollPhysics? physics;
final Widget? child;
final DragStartBehavior dragStartBehavior;
final Clip clipBehavior;
final String? restorationId;
final ScrollViewKeyboardDismissBehavior keyboardDismissBehavior;
const NPointerSingleChildScrollView({
this.scrollDirection = Axis.vertical,
this.reverse = false,
this.padding,
this.primary,
this.physics,
this.controller,
this.child,
this.dragStartBehavior = DragStartBehavior.start,
this.clipBehavior = Clip.hardEdge,
this.restorationId,
this.keyboardDismissBehavior = ScrollViewKeyboardDismissBehavior.manual,
super.key,
required this.numberOfPointers,
});
@override
State<NPointerSingleChildScrollView> createState() =>
_NPointerSingleChildScrollViewState();
}
class _NPointerSingleChildScrollViewState
extends State<NPointerSingleChildScrollView> {
@override
Widget build(BuildContext context) {
// Need logic to make it true when two or more fingers on the screen
Set<int> touchPositions = {};
void savePointerPosition(int index) {
setState(() {
touchPositions.add(index);
});
}
void clearPointerPosition(int index) {
setState(() {
touchPositions.remove(index);
});
}
return Listener(
onPointerDown: (opm) {
savePointerPosition(opm.pointer);
},
onPointerMove: (opm) {
savePointerPosition(opm.pointer);
},
onPointerCancel: (opc) {
clearPointerPosition(opc.pointer);
},
onPointerUp: (opc) {
clearPointerPosition(opc.pointer);
},
child: SingleChildScrollView(
physics: touchPositions.length != widget.numberOfPointers
? const NeverScrollableScrollPhysics()
: widget.physics,
scrollDirection: widget.scrollDirection,
reverse: widget.reverse,
padding: widget.padding,
primary: widget.primary,
controller: widget.controller,
dragStartBehavior: widget.dragStartBehavior,
clipBehavior: widget.clipBehavior,
restorationId: widget.restorationId,
keyboardDismissBehavior: widget.keyboardDismissBehavior,
child: widget.child,
),
);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment