migrate gestures to nullsafety (#62157)

This commit is contained in:
Alexandre Ardhuin 2020-07-29 00:11:05 +02:00 committed by GitHub
parent 1d5a9ae215
commit 00dcd5f49b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
25 changed files with 507 additions and 537 deletions

View File

@ -126,6 +126,7 @@ Future<void> main(List<String> arguments) async {
final List<String> dartdocArgs = <String>[
...dartdocBaseArgs,
'--allow-tools',
'--enable-experiment=non-nullable',
if (args['json'] as bool) '--json',
if (args['validate-links'] as bool) '--validate-links' else '--no-validate-links',
'--link-to-source-excludes', '../../bin/cache',

View File

@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
/// The Flutter gesture recognizers.
///
/// To use, import `package:flutter/gestures.dart`.

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'dart:async';
@ -65,7 +64,7 @@ class _GestureArena {
/// "eager winner". We look for an eager winner when closing the arena to new
/// participants, and if there is one, we resolve the arena in its favor at
/// that time.
GestureArenaMember eagerWinner;
GestureArenaMember? eagerWinner;
void add(GestureArenaMember member) {
assert(isOpen);
@ -119,7 +118,7 @@ class GestureArenaManager {
///
/// Called after the framework has finished dispatching the pointer down event.
void close(int pointer) {
final _GestureArena state = _arenas[pointer];
final _GestureArena? state = _arenas[pointer];
if (state == null)
return; // This arena either never existed or has been resolved.
state.isOpen = false;
@ -141,7 +140,7 @@ class GestureArenaManager {
/// * [hold]
/// * [release]
void sweep(int pointer) {
final _GestureArena state = _arenas[pointer];
final _GestureArena? state = _arenas[pointer];
if (state == null)
return; // This arena either never existed or has been resolved.
assert(!state.isOpen);
@ -175,7 +174,7 @@ class GestureArenaManager {
/// * [sweep]
/// * [release]
void hold(int pointer) {
final _GestureArena state = _arenas[pointer];
final _GestureArena? state = _arenas[pointer];
if (state == null)
return; // This arena either never existed or has been resolved.
state.isHeld = true;
@ -192,7 +191,7 @@ class GestureArenaManager {
/// * [sweep]
/// * [hold]
void release(int pointer) {
final _GestureArena state = _arenas[pointer];
final _GestureArena? state = _arenas[pointer];
if (state == null)
return; // This arena either never existed or has been resolved.
state.isHeld = false;
@ -205,7 +204,7 @@ class GestureArenaManager {
///
/// This is called by calling [GestureArenaEntry.resolve] on the object returned from [add].
void _resolve(int pointer, GestureArenaMember member, GestureDisposition disposition) {
final _GestureArena state = _arenas[pointer];
final _GestureArena? state = _arenas[pointer];
if (state == null)
return; // This arena has already resolved.
assert(_debugLogDiagnostic(pointer, '${ disposition == GestureDisposition.accepted ? "Accepting" : "Rejecting" }: $member'));
@ -236,7 +235,7 @@ class GestureArenaManager {
assert(_debugLogDiagnostic(pointer, 'Arena empty.'));
} else if (state.eagerWinner != null) {
assert(_debugLogDiagnostic(pointer, 'Eager winner: ${state.eagerWinner}'));
_resolveInFavorOf(pointer, state, state.eagerWinner);
_resolveInFavorOf(pointer, state, state.eagerWinner!);
}
}
@ -265,10 +264,10 @@ class GestureArenaManager {
member.acceptGesture(pointer);
}
bool _debugLogDiagnostic(int pointer, String message, [ _GestureArena state ]) {
bool _debugLogDiagnostic(int pointer, String message, [ _GestureArena? state ]) {
assert(() {
if (debugPrintGestureArenaDiagnostics) {
final int count = state != null ? state.members.length : null;
final int? count = state != null ? state.members.length : null;
final String s = count != 1 ? 's' : '';
debugPrint('Gesture arena ${pointer.toString().padRight(4)}$message${ count != null ? " with $count member$s." : ""}');
}

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'dart:async';
import 'dart:collection';
@ -75,8 +74,8 @@ mixin GestureBinding on BindingBase implements HitTestable, HitTestDispatcher, H
}
/// The singleton instance of this object.
static GestureBinding get instance => _instance;
static GestureBinding _instance;
static GestureBinding? get instance => _instance;
static GestureBinding? _instance;
final Queue<PointerEvent> _pendingPointerEvents = Queue<PointerEvent>();
@ -123,7 +122,7 @@ mixin GestureBinding on BindingBase implements HitTestable, HitTestDispatcher, H
void _handlePointerEvent(PointerEvent event) {
assert(!locked);
HitTestResult hitTestResult;
HitTestResult? hitTestResult;
if (event is PointerDownEvent || event is PointerSignalEvent) {
assert(!_hitTests.containsKey(event.pointer));
hitTestResult = HitTestResult();
@ -172,7 +171,7 @@ mixin GestureBinding on BindingBase implements HitTestable, HitTestDispatcher, H
/// might throw. The [hitTestResult] argument may only be null for
/// [PointerHoverEvent], [PointerAddedEvent], or [PointerRemovedEvent] events.
@override // from HitTestDispatcher
void dispatchEvent(PointerEvent event, HitTestResult hitTestResult) {
void dispatchEvent(PointerEvent event, HitTestResult? hitTestResult) {
assert(!locked);
// No hit test information implies that this is a hover or pointer
// add/remove event.
@ -243,12 +242,12 @@ class FlutterErrorDetailsForPointerEventDispatcher extends FlutterErrorDetails {
/// that will subsequently be reported using [FlutterError.onError].
const FlutterErrorDetailsForPointerEventDispatcher({
dynamic exception,
StackTrace stack,
String library,
DiagnosticsNode context,
StackTrace? stack,
String? library,
DiagnosticsNode? context,
this.event,
this.hitTestEntry,
InformationCollector informationCollector,
InformationCollector? informationCollector,
bool silent = false,
}) : super(
exception: exception,
@ -260,7 +259,7 @@ class FlutterErrorDetailsForPointerEventDispatcher extends FlutterErrorDetails {
);
/// The pointer event that was being routed when the exception was raised.
final PointerEvent event;
final PointerEvent? event;
/// The hit test result entry for the object whose handleEvent method threw
/// the exception. May be null if no hit test entry is associated with the
@ -268,5 +267,5 @@ class FlutterErrorDetailsForPointerEventDispatcher extends FlutterErrorDetails {
///
/// The target object itself is given by the [HitTestEntry.target] property of
/// the hitTestEntry object.
final HitTestEntry hitTestEntry;
final HitTestEntry? hitTestEntry;
}

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
// Modeled after Android's ViewConfiguration:
// https://github.com/android/platform_frameworks_base/blob/master/core/java/android/view/ViewConfiguration.java

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'dart:ui' as ui show PointerData, PointerChange, PointerSignalKind;
@ -214,7 +213,7 @@ class PointerEventConverter {
break;
}
} else {
switch (datum.signalKind) {
switch (datum.signalKind!) {
case ui.PointerSignalKind.scroll:
final Offset scrollDelta =
Offset(datum.scrollDeltaX, datum.scrollDeltaY) / devicePixelRatio;
@ -238,6 +237,5 @@ class PointerEventConverter {
}
}
static double _toLogicalPixels(double physicalPixels, double devicePixelRatio) =>
physicalPixels == null ? null : physicalPixels / devicePixelRatio;
static double _toLogicalPixels(double physicalPixels, double devicePixelRatio) => physicalPixels / devicePixelRatio;
}

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'package:flutter/foundation.dart';

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'drag_details.dart';

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'dart:ui' show Offset;
@ -24,7 +23,7 @@ class DragDownDetails {
/// The [globalPosition] argument must not be null.
DragDownDetails({
this.globalPosition = Offset.zero,
Offset localPosition,
Offset? localPosition,
}) : assert(globalPosition != null),
localPosition = localPosition ?? globalPosition;
@ -71,7 +70,7 @@ class DragStartDetails {
DragStartDetails({
this.sourceTimeStamp,
this.globalPosition = Offset.zero,
Offset localPosition,
Offset? localPosition,
}) : assert(globalPosition != null),
localPosition = localPosition ?? globalPosition;
@ -79,7 +78,7 @@ class DragStartDetails {
/// event.
///
/// Could be null if triggered from proxied events such as accessibility.
final Duration sourceTimeStamp;
final Duration? sourceTimeStamp;
/// The global position at which the pointer contacted the screen.
///
@ -134,8 +133,8 @@ class DragUpdateDetails {
this.sourceTimeStamp,
this.delta = Offset.zero,
this.primaryDelta,
@required this.globalPosition,
Offset localPosition,
required this.globalPosition,
Offset? localPosition,
}) : assert(delta != null),
assert(primaryDelta == null
|| (primaryDelta == delta.dx && delta.dy == 0.0)
@ -146,7 +145,7 @@ class DragUpdateDetails {
/// event.
///
/// Could be null if triggered from proxied events such as accessibility.
final Duration sourceTimeStamp;
final Duration? sourceTimeStamp;
/// The amount the pointer has moved in the coordinate space of the event
/// receiver since the previous update.
@ -169,7 +168,7 @@ class DragUpdateDetails {
/// two-dimensional drag (e.g., a pan), then this value is null.
///
/// Defaults to null if not specified in the constructor.
final double primaryDelta;
final double? primaryDelta;
/// The pointer's global position when it triggered this update.
///
@ -233,7 +232,7 @@ class DragEndDetails {
/// two-dimensional drag (e.g., a pan), then this value is null.
///
/// Defaults to null if not specified in the constructor.
final double primaryVelocity;
final double? primaryVelocity;
@override
String toString() => '${objectRuntimeType(this, 'DragEndDetails')}($velocity)';

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'arena.dart';
import 'events.dart';
@ -17,7 +16,7 @@ class EagerGestureRecognizer extends OneSequenceGestureRecognizer {
/// Create an eager gesture recognizer.
///
/// {@macro flutter.gestures.gestureRecognizer.kind}
EagerGestureRecognizer({ PointerDeviceKind kind }) : super(kind: kind);
EagerGestureRecognizer({ PointerDeviceKind? kind }) : super(kind: kind);
@override
void addAllowedPointer(PointerDownEvent event) {

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'dart:ui' show Offset, PointerDeviceKind;
@ -210,9 +209,9 @@ abstract class PointerEvent with Diagnosticable {
this.kind = PointerDeviceKind.touch,
this.device = 0,
this.position = Offset.zero,
Offset localPosition,
Offset? localPosition,
this.delta = Offset.zero,
Offset localDelta,
Offset? localDelta,
this.buttons = 0,
this.down = false,
this.obscured = false,
@ -459,7 +458,7 @@ abstract class PointerEvent with Diagnosticable {
///
/// * [transformed], which transforms this event into a different coordinate
/// space.
final Matrix4 transform;
final Matrix4? transform;
/// The original un-transformed [PointerEvent] before any [transform]s were
/// applied.
@ -470,7 +469,7 @@ abstract class PointerEvent with Diagnosticable {
/// event, they all receive the event transformed to their local coordinate
/// space. The [original] property can be used to determine if all those
/// transformed events actually originated from the same pointer interaction.
final PointerEvent original;
final PointerEvent? original;
/// Transforms the event from the global coordinate space into the coordinate
/// space of an event receiver.
@ -484,7 +483,7 @@ abstract class PointerEvent with Diagnosticable {
/// Transforms are not commutative. If this method is called on a
/// [PointerEvent] that has a non-null [transform] value, that value will be
/// overridden by the provided `transform`.
PointerEvent transformed(Matrix4 transform);
PointerEvent transformed(Matrix4? transform);
@override
void debugFillProperties(DiagnosticPropertiesBuilder properties) {
@ -528,7 +527,7 @@ abstract class PointerEvent with Diagnosticable {
///
/// The z-value of `position` is assumed to be 0.0. If `transform` is null,
/// `position` is returned as-is.
static Offset transformPosition(Matrix4 transform, Offset position) {
static Offset transformPosition(Matrix4? transform, Offset position) {
if (transform == null) {
return position;
}
@ -545,10 +544,10 @@ abstract class PointerEvent with Diagnosticable {
///
/// If `transform` is null, `untransformedDelta` is returned.
static Offset transformDeltaViaPositions({
@required Offset untransformedEndPosition,
Offset transformedEndPosition,
@required Offset untransformedDelta,
@required Matrix4 transform,
required Offset untransformedEndPosition,
Offset? transformedEndPosition,
required Offset untransformedDelta,
required Matrix4? transform,
}) {
if (transform == null) {
return untransformedDelta;
@ -592,7 +591,7 @@ class PointerAddedEvent extends PointerEvent {
PointerDeviceKind kind = PointerDeviceKind.touch,
int device = 0,
Offset position = Offset.zero,
Offset localPosition,
Offset? localPosition,
bool obscured = false,
double pressureMin = 1.0,
double pressureMax = 1.0,
@ -602,8 +601,8 @@ class PointerAddedEvent extends PointerEvent {
double radiusMax = 0.0,
double orientation = 0.0,
double tilt = 0.0,
Matrix4 transform,
PointerAddedEvent original,
Matrix4? transform,
PointerAddedEvent? original,
int embedderId = 0,
}) : super(
timeStamp: timeStamp,
@ -627,7 +626,7 @@ class PointerAddedEvent extends PointerEvent {
);
@override
PointerAddedEvent transformed(Matrix4 transform) {
PointerAddedEvent transformed(Matrix4? transform) {
if (transform == null || transform == this.transform) {
return this;
}
@ -647,7 +646,7 @@ class PointerAddedEvent extends PointerEvent {
orientation: orientation,
tilt: tilt,
transform: transform,
original: original as PointerAddedEvent ?? this,
original: original as PointerAddedEvent? ?? this,
embedderId: embedderId,
);
}
@ -666,15 +665,15 @@ class PointerRemovedEvent extends PointerEvent {
PointerDeviceKind kind = PointerDeviceKind.touch,
int device = 0,
Offset position = Offset.zero,
Offset localPosition,
Offset? localPosition,
bool obscured = false,
double pressureMin = 1.0,
double pressureMax = 1.0,
double distanceMax = 0.0,
double radiusMin = 0.0,
double radiusMax = 0.0,
Matrix4 transform,
PointerRemovedEvent original,
Matrix4? transform,
PointerRemovedEvent? original,
int embedderId = 0,
}) : super(
timeStamp: timeStamp,
@ -695,7 +694,7 @@ class PointerRemovedEvent extends PointerEvent {
);
@override
PointerRemovedEvent transformed(Matrix4 transform) {
PointerRemovedEvent transformed(Matrix4? transform) {
if (transform == null || transform == this.transform) {
return this;
}
@ -712,7 +711,7 @@ class PointerRemovedEvent extends PointerEvent {
radiusMin: radiusMin,
radiusMax: radiusMax,
transform: transform,
original: original as PointerRemovedEvent ?? this,
original: original as PointerRemovedEvent? ?? this,
embedderId: embedderId,
);
}
@ -739,9 +738,9 @@ class PointerHoverEvent extends PointerEvent {
PointerDeviceKind kind = PointerDeviceKind.touch,
int device = 0,
Offset position = Offset.zero,
Offset localPosition,
Offset? localPosition,
Offset delta = Offset.zero,
Offset localDelta,
Offset? localDelta,
int buttons = 0,
bool obscured = false,
double pressureMin = 1.0,
@ -756,8 +755,8 @@ class PointerHoverEvent extends PointerEvent {
double orientation = 0.0,
double tilt = 0.0,
bool synthesized = false,
Matrix4 transform,
PointerHoverEvent original,
Matrix4? transform,
PointerHoverEvent? original,
int embedderId = 0,
}) : super(
timeStamp: timeStamp,
@ -789,7 +788,7 @@ class PointerHoverEvent extends PointerEvent {
);
@override
PointerHoverEvent transformed(Matrix4 transform) {
PointerHoverEvent transformed(Matrix4? transform) {
if (transform == null || transform == this.transform) {
return this;
}
@ -822,7 +821,7 @@ class PointerHoverEvent extends PointerEvent {
tilt: tilt,
synthesized: synthesized,
transform: transform,
original: original as PointerHoverEvent ?? this,
original: original as PointerHoverEvent? ?? this,
embedderId: embedderId,
);
}
@ -849,9 +848,9 @@ class PointerEnterEvent extends PointerEvent {
PointerDeviceKind kind = PointerDeviceKind.touch,
int device = 0,
Offset position = Offset.zero,
Offset localPosition,
Offset? localPosition,
Offset delta = Offset.zero,
Offset localDelta,
Offset? localDelta,
int buttons = 0,
bool obscured = false,
double pressureMin = 1.0,
@ -867,8 +866,8 @@ class PointerEnterEvent extends PointerEvent {
double tilt = 0.0,
bool down = false,
bool synthesized = false,
Matrix4 transform,
PointerEnterEvent original,
Matrix4? transform,
PointerEnterEvent? original,
int embedderId = 0,
}) : super(
timeStamp: timeStamp,
@ -912,34 +911,34 @@ class PointerEnterEvent extends PointerEvent {
///
/// This is used by the [MouseTracker] to synthesize enter events.
PointerEnterEvent.fromMouseEvent(PointerEvent event) : this(
timeStamp: event?.timeStamp,
kind: event?.kind,
device: event?.device,
position: event?.position,
localPosition: event?.localPosition,
delta: event?.delta,
localDelta: event?.localDelta,
buttons: event?.buttons,
obscured: event?.obscured,
pressureMin: event?.pressureMin,
pressureMax: event?.pressureMax,
distance: event?.distance,
distanceMax: event?.distanceMax,
size: event?.size,
radiusMajor: event?.radiusMajor,
radiusMinor: event?.radiusMinor,
radiusMin: event?.radiusMin,
radiusMax: event?.radiusMax,
orientation: event?.orientation,
tilt: event?.tilt,
down: event?.down,
synthesized: event?.synthesized,
transform: event?.transform,
timeStamp: event.timeStamp,
kind: event.kind,
device: event.device,
position: event.position,
localPosition: event.localPosition,
delta: event.delta,
localDelta: event.localDelta,
buttons: event.buttons,
obscured: event.obscured,
pressureMin: event.pressureMin,
pressureMax: event.pressureMax,
distance: event.distance,
distanceMax: event.distanceMax,
size: event.size,
radiusMajor: event.radiusMajor,
radiusMinor: event.radiusMinor,
radiusMin: event.radiusMin,
radiusMax: event.radiusMax,
orientation: event.orientation,
tilt: event.tilt,
down: event.down,
synthesized: event.synthesized,
transform: event.transform,
original: null,
);
@override
PointerEnterEvent transformed(Matrix4 transform) {
PointerEnterEvent transformed(Matrix4? transform) {
if (transform == null || transform == this.transform) {
return this;
}
@ -973,7 +972,7 @@ class PointerEnterEvent extends PointerEvent {
down: down,
synthesized: synthesized,
transform: transform,
original: original as PointerEnterEvent ?? this,
original: original as PointerEnterEvent? ?? this,
embedderId: embedderId,
);
}
@ -1000,9 +999,9 @@ class PointerExitEvent extends PointerEvent {
PointerDeviceKind kind = PointerDeviceKind.touch,
int device = 0,
Offset position = Offset.zero,
Offset localPosition,
Offset? localPosition,
Offset delta = Offset.zero,
Offset localDelta,
Offset? localDelta,
int buttons = 0,
bool obscured = false,
double pressureMin = 1.0,
@ -1018,8 +1017,8 @@ class PointerExitEvent extends PointerEvent {
double tilt = 0.0,
bool down = false,
bool synthesized = false,
Matrix4 transform,
PointerExitEvent original,
Matrix4? transform,
PointerExitEvent? original,
int embedderId = 0,
}) : super(
timeStamp: timeStamp,
@ -1063,34 +1062,34 @@ class PointerExitEvent extends PointerEvent {
///
/// This is used by the [MouseTracker] to synthesize exit events.
PointerExitEvent.fromMouseEvent(PointerEvent event) : this(
timeStamp: event?.timeStamp,
kind: event?.kind,
device: event?.device,
position: event?.position,
localPosition: event?.localPosition,
delta: event?.delta,
localDelta: event?.localDelta,
buttons: event?.buttons,
obscured: event?.obscured,
pressureMin: event?.pressureMin,
pressureMax: event?.pressureMax,
distance: event?.distance,
distanceMax: event?.distanceMax,
size: event?.size,
radiusMajor: event?.radiusMajor,
radiusMinor: event?.radiusMinor,
radiusMin: event?.radiusMin,
radiusMax: event?.radiusMax,
orientation: event?.orientation,
tilt: event?.tilt,
down: event?.down,
synthesized: event?.synthesized,
transform: event?.transform,
timeStamp: event.timeStamp,
kind: event.kind,
device: event.device,
position: event.position,
localPosition: event.localPosition,
delta: event.delta,
localDelta: event.localDelta,
buttons: event.buttons,
obscured: event.obscured,
pressureMin: event.pressureMin,
pressureMax: event.pressureMax,
distance: event.distance,
distanceMax: event.distanceMax,
size: event.size,
radiusMajor: event.radiusMajor,
radiusMinor: event.radiusMinor,
radiusMin: event.radiusMin,
radiusMax: event.radiusMax,
orientation: event.orientation,
tilt: event.tilt,
down: event.down,
synthesized: event.synthesized,
transform: event.transform,
original: null,
);
@override
PointerExitEvent transformed(Matrix4 transform) {
PointerExitEvent transformed(Matrix4? transform) {
if (transform == null || transform == this.transform) {
return this;
}
@ -1124,7 +1123,7 @@ class PointerExitEvent extends PointerEvent {
down: down,
synthesized: synthesized,
transform: transform,
original: original as PointerExitEvent ?? this,
original: original as PointerExitEvent? ?? this,
embedderId: embedderId,
);
}
@ -1146,7 +1145,7 @@ class PointerDownEvent extends PointerEvent {
PointerDeviceKind kind = PointerDeviceKind.touch,
int device = 0,
Offset position = Offset.zero,
Offset localPosition,
Offset? localPosition,
int buttons = kPrimaryButton,
bool obscured = false,
double pressure = 1.0,
@ -1160,8 +1159,8 @@ class PointerDownEvent extends PointerEvent {
double radiusMax = 0.0,
double orientation = 0.0,
double tilt = 0.0,
Matrix4 transform,
PointerDownEvent original,
Matrix4? transform,
PointerDownEvent? original,
int embedderId = 0,
}) : super(
timeStamp: timeStamp,
@ -1191,7 +1190,7 @@ class PointerDownEvent extends PointerEvent {
);
@override
PointerDownEvent transformed(Matrix4 transform) {
PointerDownEvent transformed(Matrix4? transform) {
if (transform == null || transform == this.transform) {
return this;
}
@ -1216,7 +1215,7 @@ class PointerDownEvent extends PointerEvent {
orientation: orientation,
tilt: tilt,
transform: transform,
original: original as PointerDownEvent ?? this,
original: original as PointerDownEvent? ?? this,
embedderId: embedderId,
);
}
@ -1241,9 +1240,9 @@ class PointerMoveEvent extends PointerEvent {
PointerDeviceKind kind = PointerDeviceKind.touch,
int device = 0,
Offset position = Offset.zero,
Offset localPosition,
Offset? localPosition,
Offset delta = Offset.zero,
Offset localDelta,
Offset? localDelta,
int buttons = kPrimaryButton,
bool obscured = false,
double pressure = 1.0,
@ -1259,8 +1258,8 @@ class PointerMoveEvent extends PointerEvent {
double tilt = 0.0,
int platformData = 0,
bool synthesized = false,
Matrix4 transform,
PointerMoveEvent original,
Matrix4? transform,
PointerMoveEvent? original,
int embedderId = 0,
}) : super(
timeStamp: timeStamp,
@ -1294,7 +1293,7 @@ class PointerMoveEvent extends PointerEvent {
);
@override
PointerMoveEvent transformed(Matrix4 transform) {
PointerMoveEvent transformed(Matrix4? transform) {
if (transform == null || transform == this.transform) {
return this;
}
@ -1330,7 +1329,7 @@ class PointerMoveEvent extends PointerEvent {
platformData: platformData,
synthesized: synthesized,
transform: transform,
original: original as PointerMoveEvent ?? this,
original: original as PointerMoveEvent? ?? this,
embedderId: embedderId,
);
}
@ -1352,7 +1351,7 @@ class PointerUpEvent extends PointerEvent {
PointerDeviceKind kind = PointerDeviceKind.touch,
int device = 0,
Offset position = Offset.zero,
Offset localPosition,
Offset? localPosition,
int buttons = 0,
bool obscured = false,
// Allow pressure customization here because PointerUpEvent can contain
@ -1369,8 +1368,8 @@ class PointerUpEvent extends PointerEvent {
double radiusMax = 0.0,
double orientation = 0.0,
double tilt = 0.0,
Matrix4 transform,
PointerUpEvent original,
Matrix4? transform,
PointerUpEvent? original,
int embedderId = 0,
}) : super(
timeStamp: timeStamp,
@ -1400,7 +1399,7 @@ class PointerUpEvent extends PointerEvent {
);
@override
PointerUpEvent transformed(Matrix4 transform) {
PointerUpEvent transformed(Matrix4? transform) {
if (transform == null || transform == this.transform) {
return this;
}
@ -1426,7 +1425,7 @@ class PointerUpEvent extends PointerEvent {
orientation: orientation,
tilt: tilt,
transform: transform,
original: original as PointerUpEvent ?? this,
original: original as PointerUpEvent? ?? this,
embedderId: embedderId,
);
}
@ -1451,9 +1450,9 @@ abstract class PointerSignalEvent extends PointerEvent {
PointerDeviceKind kind = PointerDeviceKind.mouse,
int device = 0,
Offset position = Offset.zero,
Offset localPosition,
Matrix4 transform,
PointerSignalEvent original,
Offset? localPosition,
Matrix4? transform,
PointerSignalEvent? original,
int embedderId = 0,
}) : super(
timeStamp: timeStamp,
@ -1486,10 +1485,10 @@ class PointerScrollEvent extends PointerSignalEvent {
PointerDeviceKind kind = PointerDeviceKind.mouse,
int device = 0,
Offset position = Offset.zero,
Offset localPosition,
Offset? localPosition,
this.scrollDelta = Offset.zero,
Matrix4 transform,
PointerScrollEvent original,
Matrix4? transform,
PointerScrollEvent? original,
int embedderId = 0,
}) : assert(timeStamp != null),
assert(kind != null),
@ -1511,7 +1510,7 @@ class PointerScrollEvent extends PointerSignalEvent {
final Offset scrollDelta;
@override
PointerScrollEvent transformed(Matrix4 transform) {
PointerScrollEvent transformed(Matrix4? transform) {
if (transform == null || transform == this.transform) {
return this;
}
@ -1523,7 +1522,7 @@ class PointerScrollEvent extends PointerSignalEvent {
localPosition: PointerEvent.transformPosition(transform, position),
scrollDelta: scrollDelta,
transform: transform,
original: original as PointerScrollEvent ?? this,
original: original as PointerScrollEvent? ?? this,
embedderId: embedderId,
);
}
@ -1551,7 +1550,7 @@ class PointerCancelEvent extends PointerEvent {
PointerDeviceKind kind = PointerDeviceKind.touch,
int device = 0,
Offset position = Offset.zero,
Offset localPosition,
Offset? localPosition,
int buttons = 0,
bool obscured = false,
double pressureMin = 1.0,
@ -1565,8 +1564,8 @@ class PointerCancelEvent extends PointerEvent {
double radiusMax = 0.0,
double orientation = 0.0,
double tilt = 0.0,
Matrix4 transform,
PointerCancelEvent original,
Matrix4? transform,
PointerCancelEvent? original,
int embedderId = 0,
}) : super(
timeStamp: timeStamp,
@ -1596,7 +1595,7 @@ class PointerCancelEvent extends PointerEvent {
);
@override
PointerCancelEvent transformed(Matrix4 transform) {
PointerCancelEvent transformed(Matrix4? transform) {
if (transform == null || transform == this.transform) {
return this;
}
@ -1621,7 +1620,7 @@ class PointerCancelEvent extends PointerEvent {
orientation: orientation,
tilt: tilt,
transform: transform,
original: original as PointerCancelEvent ?? this,
original: original as PointerCancelEvent? ?? this,
embedderId: embedderId,
);
}

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'dart:ui' show Offset;
@ -51,9 +50,9 @@ class ForcePressDetails {
///
/// The [globalPosition] argument must not be null.
ForcePressDetails({
@required this.globalPosition,
Offset localPosition,
@required this.pressure,
required this.globalPosition,
Offset? localPosition,
required this.pressure,
}) : assert(globalPosition != null),
assert(pressure != null),
localPosition = localPosition ?? globalPosition;
@ -128,8 +127,8 @@ class ForcePressGestureRecognizer extends OneSequenceGestureRecognizer {
this.startPressure = 0.4,
this.peakPressure = 0.85,
this.interpolation = _inverseLerp,
Object debugOwner,
PointerDeviceKind kind,
Object? debugOwner,
PointerDeviceKind? kind,
}) : assert(startPressure != null),
assert(peakPressure != null),
assert(interpolation != null),
@ -143,7 +142,7 @@ class ForcePressGestureRecognizer extends OneSequenceGestureRecognizer {
///
/// The position of the pointer is provided in the callback's `details`
/// argument, which is a [ForcePressDetails] object.
GestureForcePressStartCallback onStart;
GestureForcePressStartCallback? onStart;
/// A pointer is in contact with the screen and is either moving on the plane
/// of the screen, pressing the screen with varying forces or both
@ -154,7 +153,7 @@ class ForcePressGestureRecognizer extends OneSequenceGestureRecognizer {
/// matter what the pressure is during this time period. The position and
/// pressure of the pointer is provided in the callback's `details` argument,
/// which is a [ForcePressDetails] object.
GestureForcePressUpdateCallback onUpdate;
GestureForcePressUpdateCallback? onUpdate;
/// A pointer is in contact with the screen and has just pressed with a force
/// exceeding the [peakPressure]. This is an arbitrary second level action
@ -163,13 +162,13 @@ class ForcePressGestureRecognizer extends OneSequenceGestureRecognizer {
///
/// The position of the pointer is provided in the callback's `details`
/// argument, which is a [ForcePressDetails] object.
GestureForcePressPeakCallback onPeak;
GestureForcePressPeakCallback? onPeak;
/// A pointer is no longer in contact with the screen.
///
/// The position of the pointer is provided in the callback's `details`
/// argument, which is a [ForcePressDetails] object.
GestureForcePressEndCallback onEnd;
GestureForcePressEndCallback? onEnd;
/// The pressure of the press required to initiate a force press.
///
@ -209,8 +208,8 @@ class ForcePressGestureRecognizer extends OneSequenceGestureRecognizer {
/// ```
final GestureForceInterpolation interpolation;
OffsetPair _lastPosition;
double _lastPressure;
late OffsetPair _lastPosition;
late double _lastPressure;
_ForceState _state = _ForceState.ready;
@override
@ -264,7 +263,7 @@ class ForcePressGestureRecognizer extends OneSequenceGestureRecognizer {
if (pressure > startPressure && _state == _ForceState.accepted) {
_state = _ForceState.started;
if (onStart != null) {
invokeCallback<void>('onStart', () => onStart(ForcePressDetails(
invokeCallback<void>('onStart', () => onStart!(ForcePressDetails(
pressure: pressure,
globalPosition: _lastPosition.global,
localPosition: _lastPosition.local,
@ -275,7 +274,7 @@ class ForcePressGestureRecognizer extends OneSequenceGestureRecognizer {
(_state == _ForceState.started)) {
_state = _ForceState.peaked;
if (onPeak != null) {
invokeCallback<void>('onPeak', () => onPeak(ForcePressDetails(
invokeCallback<void>('onPeak', () => onPeak!(ForcePressDetails(
pressure: pressure,
globalPosition: event.position,
localPosition: event.localPosition,
@ -285,7 +284,7 @@ class ForcePressGestureRecognizer extends OneSequenceGestureRecognizer {
if (onUpdate != null && !pressure.isNaN &&
(_state == _ForceState.started || _state == _ForceState.peaked)) {
if (onUpdate != null) {
invokeCallback<void>('onUpdate', () => onUpdate(ForcePressDetails(
invokeCallback<void>('onUpdate', () => onUpdate!(ForcePressDetails(
pressure: pressure,
globalPosition: event.position,
localPosition: event.localPosition,
@ -302,7 +301,7 @@ class ForcePressGestureRecognizer extends OneSequenceGestureRecognizer {
_state = _ForceState.accepted;
if (onStart != null && _state == _ForceState.started) {
invokeCallback<void>('onStart', () => onStart(ForcePressDetails(
invokeCallback<void>('onStart', () => onStart!(ForcePressDetails(
pressure: _lastPressure,
globalPosition: _lastPosition.global,
localPosition: _lastPosition.local,
@ -319,7 +318,7 @@ class ForcePressGestureRecognizer extends OneSequenceGestureRecognizer {
}
if (wasAccepted && onEnd != null) {
if (onEnd != null) {
invokeCallback<void>('onEnd', () => onEnd(ForcePressDetails(
invokeCallback<void>('onEnd', () => onEnd!(ForcePressDetails(
pressure: 0.0,
globalPosition: _lastPosition.global,
localPosition: _lastPosition.local,

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'package:flutter/foundation.dart';
import 'package:vector_math/vector_math_64.dart';
@ -13,8 +12,7 @@ import 'events.dart';
abstract class HitTestable {
// This class is intended to be used as an interface, and should not be
// extended directly; this constructor prevents instantiation and extension.
// ignore: unused_element
factory HitTestable._() => null;
HitTestable._();
/// Check whether the given position hits this object.
///
@ -27,8 +25,7 @@ abstract class HitTestable {
abstract class HitTestDispatcher {
// This class is intended to be used as an interface, and should not be
// extended directly; this constructor prevents instantiation and extension.
// ignore: unused_element
factory HitTestDispatcher._() => null;
HitTestDispatcher._();
/// Override this method to dispatch events.
void dispatchEvent(PointerEvent event, HitTestResult result);
@ -38,8 +35,7 @@ abstract class HitTestDispatcher {
abstract class HitTestTarget {
// This class is intended to be used as an interface, and should not be
// extended directly; this constructor prevents instantiation and extension.
// ignore: unused_element
factory HitTestTarget._() => null;
HitTestTarget._();
/// Override this method to receive events.
void handleEvent(PointerEvent event, HitTestEntry entry);
@ -67,8 +63,8 @@ class HitTestEntry {
///
/// * [BoxHitTestResult.addWithPaintTransform], which is used during hit testing
/// to build up this transform.
Matrix4 get transform => _transform;
Matrix4 _transform;
Matrix4? get transform => _transform;
Matrix4? _transform;
}
// A type of data that can be applied to a matrix by left-multiplication.

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'arena.dart';
import 'constants.dart';
@ -56,7 +55,7 @@ class LongPressStartDetails {
/// The [globalPosition] argument must not be null.
const LongPressStartDetails({
this.globalPosition = Offset.zero,
Offset localPosition,
Offset? localPosition,
}) : assert(globalPosition != null),
localPosition = localPosition ?? globalPosition;
@ -80,9 +79,9 @@ class LongPressMoveUpdateDetails {
/// The [globalPosition] and [offsetFromOrigin] arguments must not be null.
const LongPressMoveUpdateDetails({
this.globalPosition = Offset.zero,
Offset localPosition,
Offset? localPosition,
this.offsetFromOrigin = Offset.zero,
Offset localOffsetFromOrigin,
Offset? localOffsetFromOrigin,
}) : assert(globalPosition != null),
assert(offsetFromOrigin != null),
localPosition = localPosition ?? globalPosition,
@ -118,7 +117,7 @@ class LongPressEndDetails {
/// The [globalPosition] argument must not be null.
const LongPressEndDetails({
this.globalPosition = Offset.zero,
Offset localPosition,
Offset? localPosition,
this.velocity = Velocity.zero,
}) : assert(globalPosition != null),
localPosition = localPosition ?? globalPosition;
@ -162,10 +161,10 @@ class LongPressGestureRecognizer extends PrimaryPointerGestureRecognizer {
/// The [duration] argument can be used to overwrite the default duration
/// after which the long press will be recognized.
LongPressGestureRecognizer({
Duration duration,
double postAcceptSlopTolerance,
PointerDeviceKind kind,
Object debugOwner,
Duration? duration,
double? postAcceptSlopTolerance,
PointerDeviceKind? kind,
Object? debugOwner,
}) : super(
deadline: duration ?? kLongPressTimeout,
postAcceptSlopTolerance: postAcceptSlopTolerance,
@ -174,10 +173,10 @@ class LongPressGestureRecognizer extends PrimaryPointerGestureRecognizer {
);
bool _longPressAccepted = false;
OffsetPair _longPressOrigin;
OffsetPair? _longPressOrigin;
// The buttons sent by `PointerDownEvent`. If a `PointerMoveEvent` comes with a
// different set of buttons, the gesture is canceled.
int _initialButtons;
int? _initialButtons;
/// Called when a long press gesture by a primary button has been recognized.
///
@ -186,7 +185,7 @@ class LongPressGestureRecognizer extends PrimaryPointerGestureRecognizer {
/// * [kPrimaryButton], the button this callback responds to.
/// * [onLongPressStart], which has the same timing but has data for the
/// press location.
GestureLongPressCallback onLongPress;
GestureLongPressCallback? onLongPress;
/// Called when a long press gesture by a primary button has been recognized.
///
@ -195,7 +194,7 @@ class LongPressGestureRecognizer extends PrimaryPointerGestureRecognizer {
/// * [kPrimaryButton], the button this callback responds to.
/// * [onLongPress], which has the same timing but without details.
/// * [LongPressStartDetails], which is passed as an argument to this callback.
GestureLongPressStartCallback onLongPressStart;
GestureLongPressStartCallback? onLongPressStart;
/// Called when moving after the long press by a primary button is recognized.
///
@ -204,7 +203,7 @@ class LongPressGestureRecognizer extends PrimaryPointerGestureRecognizer {
/// * [kPrimaryButton], the button this callback responds to.
/// * [LongPressMoveUpdateDetails], which is passed as an argument to this
/// callback.
GestureLongPressMoveUpdateCallback onLongPressMoveUpdate;
GestureLongPressMoveUpdateCallback? onLongPressMoveUpdate;
/// Called when the pointer stops contacting the screen after a long-press
/// by a primary button.
@ -214,7 +213,7 @@ class LongPressGestureRecognizer extends PrimaryPointerGestureRecognizer {
/// * [kPrimaryButton], the button this callback responds to.
/// * [onLongPressEnd], which has the same timing but has data for the up
/// gesture location.
GestureLongPressUpCallback onLongPressUp;
GestureLongPressUpCallback? onLongPressUp;
/// Called when the pointer stops contacting the screen after a long-press
/// by a primary button.
@ -225,7 +224,7 @@ class LongPressGestureRecognizer extends PrimaryPointerGestureRecognizer {
/// * [onLongPressUp], which has the same timing, but without details.
/// * [LongPressEndDetails], which is passed as an argument to this
/// callback.
GestureLongPressEndCallback onLongPressEnd;
GestureLongPressEndCallback? onLongPressEnd;
/// Called when a long press gesture by a secondary button has been
/// recognized.
@ -235,7 +234,7 @@ class LongPressGestureRecognizer extends PrimaryPointerGestureRecognizer {
/// * [kSecondaryButton], the button this callback responds to.
/// * [onSecondaryLongPressStart], which has the same timing but has data for
/// the press location.
GestureLongPressCallback onSecondaryLongPress;
GestureLongPressCallback? onSecondaryLongPress;
/// Called when a long press gesture by a secondary button has been recognized.
///
@ -245,7 +244,7 @@ class LongPressGestureRecognizer extends PrimaryPointerGestureRecognizer {
/// * [onSecondaryLongPress], which has the same timing but without details.
/// * [LongPressStartDetails], which is passed as an argument to this
/// callback.
GestureLongPressStartCallback onSecondaryLongPressStart;
GestureLongPressStartCallback? onSecondaryLongPressStart;
/// Called when moving after the long press by a secondary button is
/// recognized.
@ -255,7 +254,7 @@ class LongPressGestureRecognizer extends PrimaryPointerGestureRecognizer {
/// * [kSecondaryButton], the button this callback responds to.
/// * [LongPressMoveUpdateDetails], which is passed as an argument to this
/// callback.
GestureLongPressMoveUpdateCallback onSecondaryLongPressMoveUpdate;
GestureLongPressMoveUpdateCallback? onSecondaryLongPressMoveUpdate;
/// Called when the pointer stops contacting the screen after a long-press by
/// a secondary button.
@ -265,7 +264,7 @@ class LongPressGestureRecognizer extends PrimaryPointerGestureRecognizer {
/// * [kSecondaryButton], the button this callback responds to.
/// * [onSecondaryLongPressEnd], which has the same timing but has data for
/// the up gesture location.
GestureLongPressUpCallback onSecondaryLongPressUp;
GestureLongPressUpCallback? onSecondaryLongPressUp;
/// Called when the pointer stops contacting the screen after a long-press by
/// a secondary button.
@ -276,9 +275,9 @@ class LongPressGestureRecognizer extends PrimaryPointerGestureRecognizer {
/// * [onSecondaryLongPressUp], which has the same timing, but without
/// details.
/// * [LongPressEndDetails], which is passed as an argument to this callback.
GestureLongPressEndCallback onSecondaryLongPressEnd;
GestureLongPressEndCallback? onSecondaryLongPressEnd;
VelocityTracker _velocityTracker;
VelocityTracker? _velocityTracker;
@override
bool isPointerAllowed(PointerDownEvent event) {
@ -310,7 +309,7 @@ class LongPressGestureRecognizer extends PrimaryPointerGestureRecognizer {
// Exceeding the deadline puts the gesture in the accepted state.
resolve(GestureDisposition.accepted);
_longPressAccepted = true;
super.acceptGesture(primaryPointer);
super.acceptGesture(primaryPointer!);
_checkLongPressStart();
}
@ -319,11 +318,11 @@ class LongPressGestureRecognizer extends PrimaryPointerGestureRecognizer {
if (!event.synthesized) {
if (event is PointerDownEvent) {
_velocityTracker = VelocityTracker();
_velocityTracker.addPosition(event.timeStamp, event.localPosition);
_velocityTracker!.addPosition(event.timeStamp, event.localPosition);
}
if (event is PointerMoveEvent) {
assert(_velocityTracker != null);
_velocityTracker.addPosition(event.timeStamp, event.localPosition);
_velocityTracker!.addPosition(event.timeStamp, event.localPosition);
}
}
@ -344,7 +343,7 @@ class LongPressGestureRecognizer extends PrimaryPointerGestureRecognizer {
} else if (event is PointerMoveEvent) {
if (event.buttons != _initialButtons) {
resolve(GestureDisposition.rejected);
stopTrackingPointer(primaryPointer);
stopTrackingPointer(primaryPointer!);
} else if (_longPressAccepted) {
_checkLongPressMoveUpdate(event);
}
@ -356,26 +355,26 @@ class LongPressGestureRecognizer extends PrimaryPointerGestureRecognizer {
case kPrimaryButton:
if (onLongPressStart != null) {
final LongPressStartDetails details = LongPressStartDetails(
globalPosition: _longPressOrigin.global,
localPosition: _longPressOrigin.local,
globalPosition: _longPressOrigin!.global,
localPosition: _longPressOrigin!.local,
);
invokeCallback<void>('onLongPressStart', () => onLongPressStart(details));
invokeCallback<void>('onLongPressStart', () => onLongPressStart!(details));
}
if (onLongPress != null) {
invokeCallback<void>('onLongPress', onLongPress);
invokeCallback<void>('onLongPress', onLongPress!);
}
break;
case kSecondaryButton:
if (onSecondaryLongPressStart != null) {
final LongPressStartDetails details = LongPressStartDetails(
globalPosition: _longPressOrigin.global,
localPosition: _longPressOrigin.local,
globalPosition: _longPressOrigin!.global,
localPosition: _longPressOrigin!.local,
);
invokeCallback<void>(
'onSecondaryLongPressStart', () => onSecondaryLongPressStart(details));
'onSecondaryLongPressStart', () => onSecondaryLongPressStart!(details));
}
if (onSecondaryLongPress != null) {
invokeCallback<void>('onSecondaryLongPress', onSecondaryLongPress);
invokeCallback<void>('onSecondaryLongPress', onSecondaryLongPress!);
}
break;
default:
@ -387,20 +386,20 @@ class LongPressGestureRecognizer extends PrimaryPointerGestureRecognizer {
final LongPressMoveUpdateDetails details = LongPressMoveUpdateDetails(
globalPosition: event.position,
localPosition: event.localPosition,
offsetFromOrigin: event.position - _longPressOrigin.global,
localOffsetFromOrigin: event.localPosition - _longPressOrigin.local,
offsetFromOrigin: event.position - _longPressOrigin!.global,
localOffsetFromOrigin: event.localPosition - _longPressOrigin!.local,
);
switch (_initialButtons) {
case kPrimaryButton:
if (onLongPressMoveUpdate != null) {
invokeCallback<void>('onLongPressMoveUpdate',
() => onLongPressMoveUpdate(details));
() => onLongPressMoveUpdate!(details));
}
break;
case kSecondaryButton:
if (onSecondaryLongPressMoveUpdate != null) {
invokeCallback<void>('onSecondaryLongPressMoveUpdate',
() => onSecondaryLongPressMoveUpdate(details));
() => onSecondaryLongPressMoveUpdate!(details));
}
break;
default:
@ -409,7 +408,7 @@ class LongPressGestureRecognizer extends PrimaryPointerGestureRecognizer {
}
void _checkLongPressEnd(PointerEvent event) {
final VelocityEstimate estimate = _velocityTracker.getVelocityEstimate();
final VelocityEstimate? estimate = _velocityTracker!.getVelocityEstimate();
final Velocity velocity = estimate == null
? Velocity.zero
: Velocity(pixelsPerSecond: estimate.pixelsPerSecond);
@ -423,18 +422,18 @@ class LongPressGestureRecognizer extends PrimaryPointerGestureRecognizer {
switch (_initialButtons) {
case kPrimaryButton:
if (onLongPressEnd != null) {
invokeCallback<void>('onLongPressEnd', () => onLongPressEnd(details));
invokeCallback<void>('onLongPressEnd', () => onLongPressEnd!(details));
}
if (onLongPressUp != null) {
invokeCallback<void>('onLongPressUp', onLongPressUp);
invokeCallback<void>('onLongPressUp', onLongPressUp!);
}
break;
case kSecondaryButton:
if (onSecondaryLongPressEnd != null) {
invokeCallback<void>('onSecondaryLongPressEnd', () => onSecondaryLongPressEnd(details));
invokeCallback<void>('onSecondaryLongPressEnd', () => onSecondaryLongPressEnd!(details));
}
if (onSecondaryLongPressUp != null) {
invokeCallback<void>('onSecondaryLongPressUp', onSecondaryLongPressUp);
invokeCallback<void>('onSecondaryLongPressUp', onSecondaryLongPressUp!);
}
break;
default:

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'dart:math' as math;
import 'dart:typed_data';
@ -76,7 +75,7 @@ class PolynomialFit {
/// An indicator of the quality of the fit.
///
/// Larger values indicate greater quality.
double confidence;
late double confidence;
}
/// Uses the least-squares algorithm to fit a polynomial to a set of data.
@ -98,7 +97,9 @@ class LeastSquaresSolver {
final List<double> w;
/// Fits a polynomial of the given degree to the data points.
PolynomialFit solve(int degree) {
///
/// When there is not enough data to fit a curve null is returned.
PolynomialFit? solve(int degree) {
if (degree > x.length) // Not enough data to fit a curve.
return null;

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'package:flutter/foundation.dart';
import 'package:vector_math/vector_math_64.dart';
@ -62,8 +61,8 @@ abstract class DragGestureRecognizer extends OneSequenceGestureRecognizer {
///
/// {@macro flutter.gestures.gestureRecognizer.kind}
DragGestureRecognizer({
Object debugOwner,
PointerDeviceKind kind,
Object? debugOwner,
PointerDeviceKind? kind,
this.dragStartBehavior = DragStartBehavior.start,
}) : assert(dragStartBehavior != null),
super(debugOwner: debugOwner, kind: kind);
@ -101,7 +100,7 @@ abstract class DragGestureRecognizer extends OneSequenceGestureRecognizer {
///
/// * [kPrimaryButton], the button this callback responds to.
/// * [DragDownDetails], which is passed as an argument to this callback.
GestureDragDownCallback onDown;
GestureDragDownCallback? onDown;
/// A pointer has contacted the screen with a primary button and has begun to
/// move.
@ -118,7 +117,7 @@ abstract class DragGestureRecognizer extends OneSequenceGestureRecognizer {
///
/// * [kPrimaryButton], the button this callback responds to.
/// * [DragStartDetails], which is passed as an argument to this callback.
GestureDragStartCallback onStart;
GestureDragStartCallback? onStart;
/// A pointer that is in contact with the screen with a primary button and
/// moving has moved again.
@ -130,7 +129,7 @@ abstract class DragGestureRecognizer extends OneSequenceGestureRecognizer {
///
/// * [kPrimaryButton], the button this callback responds to.
/// * [DragUpdateDetails], which is passed as an argument to this callback.
GestureDragUpdateCallback onUpdate;
GestureDragUpdateCallback? onUpdate;
/// A pointer that was previously in contact with the screen with a primary
/// button and moving is no longer in contact with the screen and was moving
@ -143,48 +142,48 @@ abstract class DragGestureRecognizer extends OneSequenceGestureRecognizer {
///
/// * [kPrimaryButton], the button this callback responds to.
/// * [DragEndDetails], which is passed as an argument to this callback.
GestureDragEndCallback onEnd;
GestureDragEndCallback? onEnd;
/// The pointer that previously triggered [onDown] did not complete.
///
/// See also:
///
/// * [kPrimaryButton], the button this callback responds to.
GestureDragCancelCallback onCancel;
GestureDragCancelCallback? onCancel;
/// The minimum distance an input pointer drag must have moved to
/// to be considered a fling gesture.
///
/// This value is typically compared with the distance traveled along the
/// scrolling axis. If null then [kTouchSlop] is used.
double minFlingDistance;
double? minFlingDistance;
/// The minimum velocity for an input pointer drag to be considered fling.
///
/// This value is typically compared with the magnitude of fling gesture's
/// velocity along the scrolling axis. If null then [kMinFlingVelocity]
/// is used.
double minFlingVelocity;
double? minFlingVelocity;
/// Fling velocity magnitudes will be clamped to this value.
///
/// If null then [kMaxFlingVelocity] is used.
double maxFlingVelocity;
double? maxFlingVelocity;
_DragState _state = _DragState.ready;
OffsetPair _initialPosition;
OffsetPair _pendingDragOffset;
Duration _lastPendingEventTimestamp;
late OffsetPair _initialPosition;
late OffsetPair _pendingDragOffset;
Duration? _lastPendingEventTimestamp;
// The buttons sent by `PointerDownEvent`. If a `PointerMoveEvent` comes with a
// different set of buttons, the gesture is canceled.
int _initialButtons;
Matrix4 _lastTransform;
int? _initialButtons;
Matrix4? _lastTransform;
/// Distance moved in the global coordinate space of the screen in drag direction.
///
/// If drag is only allowed along a defined axis, this value may be negative to
/// differentiate the direction of the drag.
double _globalDistanceMoved;
late double _globalDistanceMoved;
/// Determines if a gesture is a fling or not based on velocity.
///
@ -194,7 +193,7 @@ abstract class DragGestureRecognizer extends OneSequenceGestureRecognizer {
bool isFlingGesture(VelocityEstimate estimate);
Offset _getDeltaForDetails(Offset delta);
double _getPrimaryValueFromOffset(Offset value);
double? _getPrimaryValueFromOffset(Offset value);
bool get _hasSufficientGlobalDistanceToAccept;
final Map<int, VelocityTracker> _velocityTrackers = <int, VelocityTracker>{};
@ -246,7 +245,7 @@ abstract class DragGestureRecognizer extends OneSequenceGestureRecognizer {
assert(_state != _DragState.ready);
if (!event.synthesized
&& (event is PointerDownEvent || event is PointerMoveEvent)) {
final VelocityTracker tracker = _velocityTrackers[event.pointer];
final VelocityTracker tracker = _velocityTrackers[event.pointer]!;
assert(tracker != null);
tracker.addPosition(event.timeStamp, event.localPosition);
}
@ -269,7 +268,7 @@ abstract class DragGestureRecognizer extends OneSequenceGestureRecognizer {
_lastPendingEventTimestamp = event.timeStamp;
_lastTransform = event.transform;
final Offset movedLocally = _getDeltaForDetails(event.localDelta);
final Matrix4 localToGlobalTransform = event.transform == null ? null : Matrix4.tryInvert(event.transform);
final Matrix4? localToGlobalTransform = event.transform == null ? null : Matrix4.tryInvert(event.transform!);
_globalDistanceMoved += PointerEvent.transformDeltaViaPositions(
transform: localToGlobalTransform,
untransformedDelta: movedLocally,
@ -292,8 +291,8 @@ abstract class DragGestureRecognizer extends OneSequenceGestureRecognizer {
if (_state != _DragState.accepted) {
_state = _DragState.accepted;
final OffsetPair delta = _pendingDragOffset;
final Duration timestamp = _lastPendingEventTimestamp;
final Matrix4 transform = _lastTransform;
final Duration timestamp = _lastPendingEventTimestamp!;
final Matrix4? transform = _lastTransform;
Offset localUpdateDelta;
switch (dragStartBehavior) {
case DragStartBehavior.start:
@ -309,7 +308,7 @@ abstract class DragGestureRecognizer extends OneSequenceGestureRecognizer {
_lastTransform = null;
_checkStart(timestamp);
if (localUpdateDelta != Offset.zero && onUpdate != null) {
final Matrix4 localToGlobal = transform != null ? Matrix4.tryInvert(transform) : null;
final Matrix4? localToGlobal = transform != null ? Matrix4.tryInvert(transform) : null;
final Offset correctedLocalPosition = _initialPosition.local + localUpdateDelta;
final Offset globalUpdateDelta = PointerEvent.transformDeltaViaPositions(
untransformedEndPosition: correctedLocalPosition,
@ -372,7 +371,7 @@ abstract class DragGestureRecognizer extends OneSequenceGestureRecognizer {
localPosition: _initialPosition.local,
);
if (onDown != null)
invokeCallback<void>('onDown', () => onDown(details));
invokeCallback<void>('onDown', () => onDown!(details));
}
void _checkStart(Duration timestamp) {
@ -383,15 +382,15 @@ abstract class DragGestureRecognizer extends OneSequenceGestureRecognizer {
localPosition: _initialPosition.local,
);
if (onStart != null)
invokeCallback<void>('onStart', () => onStart(details));
invokeCallback<void>('onStart', () => onStart!(details));
}
void _checkUpdate({
Duration sourceTimeStamp,
Offset delta,
double primaryDelta,
Offset globalPosition,
Offset localPosition,
Duration? sourceTimeStamp,
required Offset delta,
double? primaryDelta,
required Offset globalPosition,
Offset? localPosition,
}) {
assert(_initialButtons == kPrimaryButton);
final DragUpdateDetails details = DragUpdateDetails(
@ -402,7 +401,7 @@ abstract class DragGestureRecognizer extends OneSequenceGestureRecognizer {
localPosition: localPosition,
);
if (onUpdate != null)
invokeCallback<void>('onUpdate', () => onUpdate(details));
invokeCallback<void>('onUpdate', () => onUpdate!(details));
}
void _checkEnd(int pointer) {
@ -410,13 +409,13 @@ abstract class DragGestureRecognizer extends OneSequenceGestureRecognizer {
if (onEnd == null)
return;
final VelocityTracker tracker = _velocityTrackers[pointer];
final VelocityTracker tracker = _velocityTrackers[pointer]!;
assert(tracker != null);
DragEndDetails details;
String Function() debugReport;
final VelocityEstimate estimate = tracker.getVelocityEstimate();
final VelocityEstimate? estimate = tracker.getVelocityEstimate();
if (estimate != null && isFlingGesture(estimate)) {
final Velocity velocity = Velocity(pixelsPerSecond: estimate.pixelsPerSecond)
.clampMagnitude(minFlingVelocity ?? kMinFlingVelocity, maxFlingVelocity ?? kMaxFlingVelocity);
@ -438,13 +437,13 @@ abstract class DragGestureRecognizer extends OneSequenceGestureRecognizer {
return '$estimate; judged to not be a fling.';
};
}
invokeCallback<void>('onEnd', () => onEnd(details), debugReport: debugReport);
invokeCallback<void>('onEnd', () => onEnd!(details), debugReport: debugReport);
}
void _checkCancel() {
assert(_initialButtons == kPrimaryButton);
if (onCancel != null)
invokeCallback<void>('onCancel', onCancel);
invokeCallback<void>('onCancel', onCancel!);
}
@override
@ -474,8 +473,8 @@ class VerticalDragGestureRecognizer extends DragGestureRecognizer {
///
/// {@macro flutter.gestures.gestureRecognizer.kind}
VerticalDragGestureRecognizer({
Object debugOwner,
PointerDeviceKind kind,
Object? debugOwner,
PointerDeviceKind? kind,
}) : super(debugOwner: debugOwner, kind: kind);
@override
@ -513,8 +512,8 @@ class HorizontalDragGestureRecognizer extends DragGestureRecognizer {
///
/// {@macro flutter.gestures.gestureRecognizer.kind}
HorizontalDragGestureRecognizer({
Object debugOwner,
PointerDeviceKind kind,
Object? debugOwner,
PointerDeviceKind? kind,
}) : super(debugOwner: debugOwner, kind: kind);
@override
@ -548,7 +547,7 @@ class HorizontalDragGestureRecognizer extends DragGestureRecognizer {
/// some time has passed.
class PanGestureRecognizer extends DragGestureRecognizer {
/// Create a gesture recognizer for tracking movement on a plane.
PanGestureRecognizer({ Object debugOwner }) : super(debugOwner: debugOwner);
PanGestureRecognizer({ Object? debugOwner }) : super(debugOwner: debugOwner);
@override
bool isFlingGesture(VelocityEstimate estimate) {
@ -567,7 +566,7 @@ class PanGestureRecognizer extends DragGestureRecognizer {
Offset _getDeltaForDetails(Offset delta) => delta;
@override
double _getPrimaryValueFromOffset(Offset value) => null;
double? _getPrimaryValueFromOffset(Offset value) => null;
@override
String get debugDescription => 'pan';

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'dart:async';
import 'dart:ui' show Offset;
@ -19,7 +18,7 @@ import 'recognizer.dart';
import 'velocity_tracker.dart';
/// Signature for when [MultiDragGestureRecognizer] recognizes the start of a drag gesture.
typedef GestureMultiDragStartCallback = Drag Function(Offset position);
typedef GestureMultiDragStartCallback = Drag? Function(Offset position);
/// Per-pointer state for a [MultiDragGestureRecognizer].
///
@ -36,7 +35,7 @@ abstract class MultiDragPointerState {
final Offset initialPosition;
final VelocityTracker _velocityTracker = VelocityTracker();
Drag _client;
Drag? _client;
/// The offset of the pointer from the last position that was reported to the client.
///
@ -44,12 +43,12 @@ abstract class MultiDragPointerState {
/// distance before this movement will be recognized as a drag. This field
/// accumulates that movement so that we can report it to the client after
/// the drag starts.
Offset get pendingDelta => _pendingDelta;
Offset _pendingDelta = Offset.zero;
Offset? get pendingDelta => _pendingDelta;
Offset? _pendingDelta = Offset.zero;
Duration _lastPendingEventTimestamp;
Duration? _lastPendingEventTimestamp;
GestureArenaEntry _arenaEntry;
GestureArenaEntry? _arenaEntry;
void _setArenaEntry(GestureArenaEntry entry) {
assert(_arenaEntry == null);
assert(pendingDelta != null);
@ -61,7 +60,7 @@ abstract class MultiDragPointerState {
@protected
@mustCallSuper
void resolve(GestureDisposition disposition) {
_arenaEntry.resolve(disposition);
_arenaEntry!.resolve(disposition);
}
void _move(PointerMoveEvent event) {
@ -71,14 +70,14 @@ abstract class MultiDragPointerState {
if (_client != null) {
assert(pendingDelta == null);
// Call client last to avoid reentrancy.
_client.update(DragUpdateDetails(
_client!.update(DragUpdateDetails(
sourceTimeStamp: event.timeStamp,
delta: event.delta,
globalPosition: event.position,
));
} else {
assert(pendingDelta != null);
_pendingDelta += event.delta;
_pendingDelta = _pendingDelta! + event.delta;
_lastPendingEventTimestamp = event.timeStamp;
checkForResolutionAfterMove();
}
@ -119,13 +118,13 @@ abstract class MultiDragPointerState {
_client = client;
final DragUpdateDetails details = DragUpdateDetails(
sourceTimeStamp: _lastPendingEventTimestamp,
delta: pendingDelta,
delta: pendingDelta!,
globalPosition: initialPosition,
);
_pendingDelta = null;
_lastPendingEventTimestamp = null;
// Call client last to avoid reentrancy.
_client.update(details);
_client!.update(details);
}
void _up() {
@ -133,7 +132,7 @@ abstract class MultiDragPointerState {
if (_client != null) {
assert(pendingDelta == null);
final DragEndDetails details = DragEndDetails(velocity: _velocityTracker.getVelocity());
final Drag client = _client;
final Drag client = _client!;
_client = null;
// Call client last to avoid reentrancy.
client.end(details);
@ -148,7 +147,7 @@ abstract class MultiDragPointerState {
assert(_arenaEntry != null);
if (_client != null) {
assert(pendingDelta == null);
final Drag client = _client;
final Drag client = _client!;
_client = null;
// Call client last to avoid reentrancy.
client.cancel();
@ -195,28 +194,28 @@ abstract class MultiDragPointerState {
abstract class MultiDragGestureRecognizer<T extends MultiDragPointerState> extends GestureRecognizer {
/// Initialize the object.
MultiDragGestureRecognizer({
@required Object debugOwner,
PointerDeviceKind kind,
required Object? debugOwner,
PointerDeviceKind? kind,
}) : super(debugOwner: debugOwner, kind: kind);
/// Called when this class recognizes the start of a drag gesture.
///
/// The remaining notifications for this drag gesture are delivered to the
/// [Drag] object returned by this callback.
GestureMultiDragStartCallback onStart;
GestureMultiDragStartCallback? onStart;
Map<int, T> _pointers = <int, T>{};
Map<int, T>? _pointers = <int, T>{};
@override
void addAllowedPointer(PointerDownEvent event) {
assert(_pointers != null);
assert(event.pointer != null);
assert(event.position != null);
assert(!_pointers.containsKey(event.pointer));
assert(!_pointers!.containsKey(event.pointer));
final T state = createNewPointerState(event);
_pointers[event.pointer] = state;
GestureBinding.instance.pointerRouter.addRoute(event.pointer, _handleEvent);
state._setArenaEntry(GestureBinding.instance.gestureArena.add(event.pointer, this));
_pointers![event.pointer] = state;
GestureBinding.instance!.pointerRouter.addRoute(event.pointer, _handleEvent);
state._setArenaEntry(GestureBinding.instance!.gestureArena.add(event.pointer, this));
}
/// Subclasses should override this method to create per-pointer state
@ -230,8 +229,8 @@ abstract class MultiDragGestureRecognizer<T extends MultiDragPointerState> exten
assert(event.pointer != null);
assert(event.timeStamp != null);
assert(event.position != null);
assert(_pointers.containsKey(event.pointer));
final T state = _pointers[event.pointer];
assert(_pointers!.containsKey(event.pointer));
final T state = _pointers![event.pointer]!;
if (event is PointerMoveEvent) {
state._move(event);
// We might be disposed here.
@ -256,20 +255,20 @@ abstract class MultiDragGestureRecognizer<T extends MultiDragPointerState> exten
@override
void acceptGesture(int pointer) {
assert(_pointers != null);
final T state = _pointers[pointer];
final T? state = _pointers![pointer];
if (state == null)
return; // We might already have canceled this drag if the up comes before the accept.
state.accepted((Offset initialPosition) => _startDrag(initialPosition, pointer));
}
Drag _startDrag(Offset initialPosition, int pointer) {
Drag? _startDrag(Offset initialPosition, int pointer) {
assert(_pointers != null);
final T state = _pointers[pointer];
final T state = _pointers![pointer]!;
assert(state != null);
assert(state._pendingDelta != null);
Drag drag;
Drag? drag;
if (onStart != null)
drag = invokeCallback<Drag>('onStart', () => onStart(initialPosition));
drag = invokeCallback<Drag?>('onStart', () => onStart!(initialPosition));
if (drag != null) {
state._startDrag(drag);
} else {
@ -281,8 +280,8 @@ abstract class MultiDragGestureRecognizer<T extends MultiDragPointerState> exten
@override
void rejectGesture(int pointer) {
assert(_pointers != null);
if (_pointers.containsKey(pointer)) {
final T state = _pointers[pointer];
if (_pointers!.containsKey(pointer)) {
final T state = _pointers![pointer]!;
assert(state != null);
state.rejected();
_removeState(pointer);
@ -295,15 +294,15 @@ abstract class MultiDragGestureRecognizer<T extends MultiDragPointerState> exten
// for the given pointer because dispose() has already removed it.
return;
}
assert(_pointers.containsKey(pointer));
GestureBinding.instance.pointerRouter.removeRoute(pointer, _handleEvent);
_pointers.remove(pointer).dispose();
assert(_pointers!.containsKey(pointer));
GestureBinding.instance!.pointerRouter.removeRoute(pointer, _handleEvent);
_pointers!.remove(pointer)!.dispose();
}
@override
void dispose() {
_pointers.keys.toList().forEach(_removeState);
assert(_pointers.isEmpty);
_pointers!.keys.toList().forEach(_removeState);
assert(_pointers!.isEmpty);
_pointers = null;
super.dispose();
}
@ -315,7 +314,7 @@ class _ImmediatePointerState extends MultiDragPointerState {
@override
void checkForResolutionAfterMove() {
assert(pendingDelta != null);
if (pendingDelta.distance > kTouchSlop)
if (pendingDelta!.distance > kTouchSlop)
resolve(GestureDisposition.accepted);
}
@ -344,8 +343,8 @@ class _ImmediatePointerState extends MultiDragPointerState {
class ImmediateMultiDragGestureRecognizer extends MultiDragGestureRecognizer<_ImmediatePointerState> {
/// Create a gesture recognizer for tracking multiple pointers at once.
ImmediateMultiDragGestureRecognizer({
Object debugOwner,
PointerDeviceKind kind,
Object? debugOwner,
PointerDeviceKind? kind,
}) : super(debugOwner: debugOwner, kind: kind);
@override
@ -364,7 +363,7 @@ class _HorizontalPointerState extends MultiDragPointerState {
@override
void checkForResolutionAfterMove() {
assert(pendingDelta != null);
if (pendingDelta.dx.abs() > kTouchSlop)
if (pendingDelta!.dx.abs() > kTouchSlop)
resolve(GestureDisposition.accepted);
}
@ -393,8 +392,8 @@ class HorizontalMultiDragGestureRecognizer extends MultiDragGestureRecognizer<_H
/// Create a gesture recognizer for tracking multiple pointers at once
/// but only if they first move horizontally.
HorizontalMultiDragGestureRecognizer({
Object debugOwner,
PointerDeviceKind kind,
Object? debugOwner,
PointerDeviceKind? kind,
}) : super(debugOwner: debugOwner, kind: kind);
@override
@ -413,7 +412,7 @@ class _VerticalPointerState extends MultiDragPointerState {
@override
void checkForResolutionAfterMove() {
assert(pendingDelta != null);
if (pendingDelta.dy.abs() > kTouchSlop)
if (pendingDelta!.dy.abs() > kTouchSlop)
resolve(GestureDisposition.accepted);
}
@ -442,8 +441,8 @@ class VerticalMultiDragGestureRecognizer extends MultiDragGestureRecognizer<_Ver
/// Create a gesture recognizer for tracking multiple pointers at once
/// but only if they first move vertically.
VerticalMultiDragGestureRecognizer({
Object debugOwner,
PointerDeviceKind kind,
Object? debugOwner,
PointerDeviceKind? kind,
}) : super(debugOwner: debugOwner, kind: kind);
@override
@ -462,16 +461,16 @@ class _DelayedPointerState extends MultiDragPointerState {
_timer = Timer(delay, _delayPassed);
}
Timer _timer;
GestureMultiDragStartCallback _starter;
Timer? _timer;
GestureMultiDragStartCallback? _starter;
void _delayPassed() {
assert(_timer != null);
assert(pendingDelta != null);
assert(pendingDelta.distance <= kTouchSlop);
assert(pendingDelta!.distance <= kTouchSlop);
_timer = null;
if (_starter != null) {
_starter(initialPosition);
_starter!(initialPosition);
_starter = null;
} else {
resolve(GestureDisposition.accepted);
@ -505,7 +504,7 @@ class _DelayedPointerState extends MultiDragPointerState {
return;
}
assert(pendingDelta != null);
if (pendingDelta.distance > kTouchSlop) {
if (pendingDelta!.distance > kTouchSlop) {
resolve(GestureDisposition.rejected);
_ensureTimerStopped();
}
@ -545,8 +544,8 @@ class DelayedMultiDragGestureRecognizer extends MultiDragGestureRecognizer<_Dela
/// can be changed for specific behaviors.
DelayedMultiDragGestureRecognizer({
this.delay = kLongPressTimeout,
Object debugOwner,
PointerDeviceKind kind,
Object? debugOwner,
PointerDeviceKind? kind,
}) : assert(delay != null),
super(debugOwner: debugOwner, kind: kind);

View File

@ -2,11 +2,9 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'dart:async';
import 'dart:ui' show Offset;
import 'package:flutter/foundation.dart' show required;
import 'package:vector_math/vector_math_64.dart';
import 'arena.dart';
@ -43,7 +41,7 @@ typedef GestureMultiTapCancelCallback = void Function(int pointer);
/// CountdownZoned tracks whether the specified duration has elapsed since
/// creation, honoring [Zone].
class _CountdownZoned {
_CountdownZoned({ @required Duration duration })
_CountdownZoned({ required Duration duration })
: assert(duration != null) {
Timer(duration, _onTimeout);
}
@ -61,9 +59,9 @@ class _CountdownZoned {
/// larger gesture.
class _TapTracker {
_TapTracker({
@required PointerDownEvent event,
required PointerDownEvent event,
this.entry,
@required Duration doubleTapMinTime,
required Duration doubleTapMinTime,
}) : assert(doubleTapMinTime != null),
assert(event != null),
assert(event.buttons != null),
@ -73,24 +71,24 @@ class _TapTracker {
_doubleTapMinTimeCountdown = _CountdownZoned(duration: doubleTapMinTime);
final int pointer;
final GestureArenaEntry entry;
final GestureArenaEntry? entry;
final Offset _initialGlobalPosition;
final int initialButtons;
final _CountdownZoned _doubleTapMinTimeCountdown;
bool _isTrackingPointer = false;
void startTrackingPointer(PointerRoute route, Matrix4 transform) {
void startTrackingPointer(PointerRoute route, Matrix4? transform) {
if (!_isTrackingPointer) {
_isTrackingPointer = true;
GestureBinding.instance.pointerRouter.addRoute(pointer, route, transform);
GestureBinding.instance!.pointerRouter.addRoute(pointer, route, transform);
}
}
void stopTrackingPointer(PointerRoute route) {
if (_isTrackingPointer) {
_isTrackingPointer = false;
GestureBinding.instance.pointerRouter.removeRoute(pointer, route);
GestureBinding.instance!.pointerRouter.removeRoute(pointer, route);
}
}
@ -119,8 +117,8 @@ class DoubleTapGestureRecognizer extends GestureRecognizer {
///
/// {@macro flutter.gestures.gestureRecognizer.kind}
DoubleTapGestureRecognizer({
Object debugOwner,
PointerDeviceKind kind,
Object? debugOwner,
PointerDeviceKind? kind,
}) : super(debugOwner: debugOwner, kind: kind);
// Implementation notes:
@ -152,10 +150,10 @@ class DoubleTapGestureRecognizer extends GestureRecognizer {
/// See also:
///
/// * [kPrimaryButton], the button this callback responds to.
GestureDoubleTapCallback onDoubleTap;
GestureDoubleTapCallback? onDoubleTap;
Timer _doubleTapTimer;
_TapTracker _firstTap;
Timer? _doubleTapTimer;
_TapTracker? _firstTap;
final Map<int, _TapTracker> _trackers = <int, _TapTracker>{};
@override
@ -176,10 +174,10 @@ class DoubleTapGestureRecognizer extends GestureRecognizer {
@override
void addAllowedPointer(PointerEvent event) {
if (_firstTap != null) {
if (!_firstTap.isWithinGlobalTolerance(event, kDoubleTapSlop)) {
if (!_firstTap!.isWithinGlobalTolerance(event, kDoubleTapSlop)) {
// Ignore out-of-bounds second taps.
return;
} else if (!_firstTap.hasElapsedMinTime() || !_firstTap.hasSameButton(event as PointerDownEvent)) {
} else if (!_firstTap!.hasElapsedMinTime() || !_firstTap!.hasSameButton(event as PointerDownEvent)) {
// Restart when the second tap is too close to the first, or when buttons
// mismatch.
_reset();
@ -193,7 +191,7 @@ class DoubleTapGestureRecognizer extends GestureRecognizer {
_stopDoubleTapTimer();
final _TapTracker tracker = _TapTracker(
event: event as PointerDownEvent,
entry: GestureBinding.instance.gestureArena.add(event.pointer, this),
entry: GestureBinding.instance!.gestureArena.add(event.pointer, this),
doubleTapMinTime: kDoubleTapMinTime,
);
_trackers[event.pointer] = tracker;
@ -201,8 +199,7 @@ class DoubleTapGestureRecognizer extends GestureRecognizer {
}
void _handleEvent(PointerEvent event) {
final _TapTracker tracker = _trackers[event.pointer];
assert(tracker != null);
final _TapTracker tracker = _trackers[event.pointer]!;
if (event is PointerUpEvent) {
if (_firstTap == null)
_registerFirstTap(tracker);
@ -221,11 +218,11 @@ class DoubleTapGestureRecognizer extends GestureRecognizer {
@override
void rejectGesture(int pointer) {
_TapTracker tracker = _trackers[pointer];
_TapTracker? tracker = _trackers[pointer];
// If tracker isn't in the list, check if this is the first tap tracker
if (tracker == null &&
_firstTap != null &&
_firstTap.pointer == pointer)
_firstTap!.pointer == pointer)
tracker = _firstTap;
// If tracker is still null, we rejected ourselves already
if (tracker != null)
@ -234,7 +231,7 @@ class DoubleTapGestureRecognizer extends GestureRecognizer {
void _reject(_TapTracker tracker) {
_trackers.remove(tracker.pointer);
tracker.entry.resolve(GestureDisposition.rejected);
tracker.entry!.resolve(GestureDisposition.rejected);
_freezeTracker(tracker);
// If the first tap is in progress, and we've run out of taps to track,
// reset won't have any work to do. But if we're in the second tap, we need
@ -255,17 +252,17 @@ class DoubleTapGestureRecognizer extends GestureRecognizer {
if (_firstTap != null) {
// Note, order is important below in order for the resolve -> reject logic
// to work properly.
final _TapTracker tracker = _firstTap;
final _TapTracker tracker = _firstTap!;
_firstTap = null;
_reject(tracker);
GestureBinding.instance.gestureArena.release(tracker.pointer);
GestureBinding.instance!.gestureArena.release(tracker.pointer);
}
_clearTrackers();
}
void _registerFirstTap(_TapTracker tracker) {
_startDoubleTapTimer();
GestureBinding.instance.gestureArena.hold(tracker.pointer);
GestureBinding.instance!.gestureArena.hold(tracker.pointer);
// Note, order is important below in order for the clear -> reject logic to
// work properly.
_freezeTracker(tracker);
@ -275,8 +272,8 @@ class DoubleTapGestureRecognizer extends GestureRecognizer {
}
void _registerSecondTap(_TapTracker tracker) {
_firstTap.entry.resolve(GestureDisposition.accepted);
tracker.entry.resolve(GestureDisposition.accepted);
_firstTap!.entry!.resolve(GestureDisposition.accepted);
tracker.entry!.resolve(GestureDisposition.accepted);
_freezeTracker(tracker);
_trackers.remove(tracker.pointer);
_checkUp(tracker.initialButtons);
@ -298,7 +295,7 @@ class DoubleTapGestureRecognizer extends GestureRecognizer {
void _stopDoubleTapTimer() {
if (_doubleTapTimer != null) {
_doubleTapTimer.cancel();
_doubleTapTimer!.cancel();
_doubleTapTimer = null;
}
}
@ -306,7 +303,7 @@ class DoubleTapGestureRecognizer extends GestureRecognizer {
void _checkUp(int buttons) {
assert(buttons == kPrimaryButton);
if (onDoubleTap != null)
invokeCallback<void>('onDoubleTap', onDoubleTap);
invokeCallback<void>('onDoubleTap', onDoubleTap!);
}
@override
@ -319,13 +316,13 @@ class DoubleTapGestureRecognizer extends GestureRecognizer {
class _TapGesture extends _TapTracker {
_TapGesture({
this.gestureRecognizer,
PointerEvent event,
Duration longTapDelay,
required this.gestureRecognizer,
required PointerEvent event,
required Duration longTapDelay,
}) : _lastPosition = OffsetPair.fromEventPosition(event),
super(
event: event as PointerDownEvent,
entry: GestureBinding.instance.gestureArena.add(event.pointer, gestureRecognizer),
entry: GestureBinding.instance!.gestureArena.add(event.pointer, gestureRecognizer),
doubleTapMinTime: kDoubleTapMinTime,
) {
startTrackingPointer(handleEvent, event.transform);
@ -340,10 +337,10 @@ class _TapGesture extends _TapTracker {
final MultiTapGestureRecognizer gestureRecognizer;
bool _wonArena = false;
Timer _timer;
Timer? _timer;
OffsetPair _lastPosition;
OffsetPair _finalPosition;
OffsetPair? _finalPosition;
void handleEvent(PointerEvent event) {
assert(event.pointer == pointer);
@ -384,12 +381,12 @@ class _TapGesture extends _TapTracker {
if (_wonArena)
reject();
else
entry.resolve(GestureDisposition.rejected); // eventually calls reject()
entry!.resolve(GestureDisposition.rejected); // eventually calls reject()
}
void _check() {
if (_wonArena && _finalPosition != null)
gestureRecognizer._dispatchTap(pointer, _finalPosition);
gestureRecognizer._dispatchTap(pointer, _finalPosition!);
}
}
@ -409,31 +406,31 @@ class MultiTapGestureRecognizer extends GestureRecognizer {
/// [onLongTapDown] is called immediately after [onTapDown].
MultiTapGestureRecognizer({
this.longTapDelay = Duration.zero,
Object debugOwner,
PointerDeviceKind kind,
Object? debugOwner,
PointerDeviceKind? kind,
}) : super(debugOwner: debugOwner, kind: kind);
/// A pointer that might cause a tap has contacted the screen at a particular
/// location.
GestureMultiTapDownCallback onTapDown;
GestureMultiTapDownCallback? onTapDown;
/// A pointer that will trigger a tap has stopped contacting the screen at a
/// particular location.
GestureMultiTapUpCallback onTapUp;
GestureMultiTapUpCallback? onTapUp;
/// A tap has occurred.
GestureMultiTapCallback onTap;
GestureMultiTapCallback? onTap;
/// The pointer that previously triggered [onTapDown] will not end up causing
/// a tap.
GestureMultiTapCancelCallback onTapCancel;
GestureMultiTapCancelCallback? onTapCancel;
/// The amount of time between [onTapDown] and [onLongTapDown].
Duration longTapDelay;
/// A pointer that might cause a tap is still in contact with the screen at a
/// particular location after [longTapDelay].
GestureMultiTapDownCallback onLongTapDown;
GestureMultiTapDownCallback? onLongTapDown;
final Map<int, _TapGesture> _gestureMap = <int, _TapGesture>{};
@ -447,7 +444,7 @@ class MultiTapGestureRecognizer extends GestureRecognizer {
);
if (onTapDown != null)
invokeCallback<void>('onTapDown', () {
onTapDown(event.pointer, TapDownDetails(
onTapDown!(event.pointer, TapDownDetails(
globalPosition: event.position,
localPosition: event.localPosition,
kind: event.kind,
@ -458,13 +455,13 @@ class MultiTapGestureRecognizer extends GestureRecognizer {
@override
void acceptGesture(int pointer) {
assert(_gestureMap.containsKey(pointer));
_gestureMap[pointer].accept();
_gestureMap[pointer]!.accept();
}
@override
void rejectGesture(int pointer) {
assert(_gestureMap.containsKey(pointer));
_gestureMap[pointer].reject();
_gestureMap[pointer]!.reject();
assert(!_gestureMap.containsKey(pointer));
}
@ -472,7 +469,7 @@ class MultiTapGestureRecognizer extends GestureRecognizer {
assert(_gestureMap.containsKey(pointer));
_gestureMap.remove(pointer);
if (onTapCancel != null)
invokeCallback<void>('onTapCancel', () => onTapCancel(pointer));
invokeCallback<void>('onTapCancel', () => onTapCancel!(pointer));
}
void _dispatchTap(int pointer, OffsetPair position) {
@ -480,20 +477,20 @@ class MultiTapGestureRecognizer extends GestureRecognizer {
_gestureMap.remove(pointer);
if (onTapUp != null)
invokeCallback<void>('onTapUp', () {
onTapUp(pointer, TapUpDetails(
onTapUp!(pointer, TapUpDetails(
localPosition: position.local,
globalPosition: position.global,
));
});
if (onTap != null)
invokeCallback<void>('onTap', () => onTap(pointer));
invokeCallback<void>('onTap', () => onTap!(pointer));
}
void _dispatchLongTap(int pointer, OffsetPair lastPosition) {
assert(_gestureMap.containsKey(pointer));
if (onLongTapDown != null)
invokeCallback<void>('onLongTapDown', () {
onLongTapDown(
onLongTapDown!(
pointer,
TapDownDetails(
globalPosition: lastPosition.global,

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'package:flutter/foundation.dart';
import 'package:vector_math/vector_math_64.dart';
@ -14,8 +13,8 @@ typedef PointerRoute = void Function(PointerEvent event);
/// A routing table for [PointerEvent] events.
class PointerRouter {
final Map<int, Map<PointerRoute, Matrix4>> _routeMap = <int, Map<PointerRoute, Matrix4>>{};
final Map<PointerRoute, Matrix4> _globalRoutes = <PointerRoute, Matrix4>{};
final Map<int, Map<PointerRoute, Matrix4?>> _routeMap = <int, Map<PointerRoute, Matrix4?>>{};
final Map<PointerRoute, Matrix4?> _globalRoutes = <PointerRoute, Matrix4?>{};
/// Adds a route to the routing table.
///
@ -24,10 +23,10 @@ class PointerRouter {
///
/// Routes added reentrantly within [PointerRouter.route] will take effect when
/// routing the next event.
void addRoute(int pointer, PointerRoute route, [Matrix4 transform]) {
final Map<PointerRoute, Matrix4> routes = _routeMap.putIfAbsent(
void addRoute(int pointer, PointerRoute route, [Matrix4? transform]) {
final Map<PointerRoute, Matrix4?> routes = _routeMap.putIfAbsent(
pointer,
() => <PointerRoute, Matrix4>{},
() => <PointerRoute, Matrix4?>{},
);
assert(!routes.containsKey(route));
routes[route] = transform;
@ -42,7 +41,7 @@ class PointerRouter {
/// immediately.
void removeRoute(int pointer, PointerRoute route) {
assert(_routeMap.containsKey(pointer));
final Map<PointerRoute, Matrix4> routes = _routeMap[pointer];
final Map<PointerRoute, Matrix4?> routes = _routeMap[pointer]!;
assert(routes.containsKey(route));
routes.remove(route);
if (routes.isEmpty)
@ -55,7 +54,7 @@ class PointerRouter {
///
/// Routes added reentrantly within [PointerRouter.route] will take effect when
/// routing the next event.
void addGlobalRoute(PointerRoute route, [Matrix4 transform]) {
void addGlobalRoute(PointerRoute route, [Matrix4? transform]) {
assert(!_globalRoutes.containsKey(route));
_globalRoutes[route] = transform;
}
@ -72,12 +71,12 @@ class PointerRouter {
_globalRoutes.remove(route);
}
void _dispatch(PointerEvent event, PointerRoute route, Matrix4 transform) {
void _dispatch(PointerEvent event, PointerRoute route, Matrix4? transform) {
try {
event = event.transformed(transform);
route(event);
} catch (exception, stack) {
InformationCollector collector;
InformationCollector? collector;
assert(() {
collector = () sync* {
yield DiagnosticsProperty<PointerRouter>('router', this, level: DiagnosticLevel.debug);
@ -101,13 +100,13 @@ class PointerRouter {
/// Routes are called in the order in which they were added to the
/// PointerRouter object.
void route(PointerEvent event) {
final Map<PointerRoute, Matrix4> routes = _routeMap[event.pointer];
final Map<PointerRoute, Matrix4> copiedGlobalRoutes = Map<PointerRoute, Matrix4>.from(_globalRoutes);
final Map<PointerRoute, Matrix4?>? routes = _routeMap[event.pointer];
final Map<PointerRoute, Matrix4?> copiedGlobalRoutes = Map<PointerRoute, Matrix4?>.from(_globalRoutes);
if (routes != null) {
_dispatchEventToRoutes(
event,
routes,
Map<PointerRoute, Matrix4>.from(routes),
Map<PointerRoute, Matrix4?>.from(routes),
);
}
_dispatchEventToRoutes(event, _globalRoutes, copiedGlobalRoutes);
@ -115,10 +114,10 @@ class PointerRouter {
void _dispatchEventToRoutes(
PointerEvent event,
Map<PointerRoute, Matrix4> referenceRoutes,
Map<PointerRoute, Matrix4> copiedRoutes,
Map<PointerRoute, Matrix4?> referenceRoutes,
Map<PointerRoute, Matrix4?> copiedRoutes,
) {
copiedRoutes.forEach((PointerRoute route, Matrix4 transform) {
copiedRoutes.forEach((PointerRoute route, Matrix4? transform) {
if (referenceRoutes.containsKey(route)) {
_dispatch(event, route, transform);
}

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'package:flutter/foundation.dart';
@ -27,15 +26,15 @@ bool _isSameEvent(PointerSignalEvent event1, PointerSignalEvent event2) {
/// at the end of event dispatch. The first callback registered will be the one
/// that is called.
class PointerSignalResolver {
PointerSignalResolvedCallback _firstRegisteredCallback;
PointerSignalResolvedCallback? _firstRegisteredCallback;
PointerSignalEvent _currentEvent;
PointerSignalEvent? _currentEvent;
/// Registers interest in handling [event].
void register(PointerSignalEvent event, PointerSignalResolvedCallback callback) {
assert(event != null);
assert(callback != null);
assert(_currentEvent == null || _isSameEvent(_currentEvent, event));
assert(_currentEvent == null || _isSameEvent(_currentEvent!, event));
if (_firstRegisteredCallback != null) {
return;
}
@ -53,11 +52,11 @@ class PointerSignalResolver {
assert(_currentEvent == null);
return;
}
assert(_isSameEvent(_currentEvent, event));
assert(_isSameEvent(_currentEvent!, event));
try {
_firstRegisteredCallback(_currentEvent);
_firstRegisteredCallback!(_currentEvent!);
} catch (exception, stack) {
InformationCollector collector;
InformationCollector? collector;
assert(() {
collector = () sync* {
yield DiagnosticsProperty<PointerSignalEvent>('Event', event, style: DiagnosticsTreeStyle.errorProperty);

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'dart:async';
import 'dart:collection';
@ -67,17 +66,17 @@ abstract class GestureRecognizer extends GestureArenaMember with DiagnosticableT
/// by providing the optional [kind] argument. If [kind] is null,
/// the recognizer will accept pointer events from all device kinds.
/// {@endtemplate}
GestureRecognizer({ this.debugOwner, PointerDeviceKind kind }) : _kindFilter = kind;
GestureRecognizer({ this.debugOwner, PointerDeviceKind? kind }) : _kindFilter = kind;
/// The recognizer's owner.
///
/// This is used in the [toString] serialization to report the object for which
/// this gesture recognizer was created, to aid in debugging.
final Object debugOwner;
final Object? debugOwner;
/// The kind of device that's allowed to be recognized. If null, events from
/// all device kinds will be tracked and recognized.
final PointerDeviceKind _kindFilter;
final PointerDeviceKind? _kindFilter;
/// Holds a mapping between pointer IDs and the kind of devices they are
/// coming from.
@ -141,7 +140,7 @@ abstract class GestureRecognizer extends GestureArenaMember with DiagnosticableT
@protected
PointerDeviceKind getKindForPointer(int pointer) {
assert(_pointerToKind.containsKey(pointer));
return _pointerToKind[pointer];
return _pointerToKind[pointer]!;
}
/// Releases any resources used by the object.
@ -167,13 +166,13 @@ abstract class GestureRecognizer extends GestureArenaMember with DiagnosticableT
/// callback that returns a string describing useful debugging information,
/// e.g. the arguments passed to the callback.
@protected
T invokeCallback<T>(String name, RecognizerCallback<T> callback, { String debugReport() }) {
T? invokeCallback<T>(String name, RecognizerCallback<T> callback, { String Function()? debugReport }) {
assert(callback != null);
T result;
T? result;
try {
assert(() {
if (debugPrintRecognizerCallbacksTrace) {
final String report = debugReport != null ? debugReport() : null;
final String? report = debugReport != null ? debugReport() : null;
// The 19 in the line below is the width of the prefix used by
// _debugLogDiagnostic in arena.dart.
final String prefix = debugPrintGestureArenaDiagnostics ? ' ' * 19 + '' : '';
@ -183,7 +182,7 @@ abstract class GestureRecognizer extends GestureArenaMember with DiagnosticableT
}());
result = callback();
} catch (exception, stack) {
InformationCollector collector;
InformationCollector? collector;
assert(() {
collector = () sync* {
yield StringProperty('Handler', name);
@ -222,8 +221,8 @@ abstract class OneSequenceGestureRecognizer extends GestureRecognizer {
///
/// {@macro flutter.gestures.gestureRecognizer.kind}
OneSequenceGestureRecognizer({
Object debugOwner,
PointerDeviceKind kind,
Object? debugOwner,
PointerDeviceKind? kind,
}) : super(debugOwner: debugOwner, kind: kind);
final Map<int, GestureArenaEntry> _entries = <int, GestureArenaEntry>{};
@ -267,7 +266,7 @@ abstract class OneSequenceGestureRecognizer extends GestureRecognizer {
@protected
@mustCallSuper
void resolvePointer(int pointer, GestureDisposition disposition) {
final GestureArenaEntry entry = _entries[pointer];
final GestureArenaEntry? entry = _entries[pointer];
if (entry != null) {
entry.resolve(disposition);
_entries.remove(pointer);
@ -278,7 +277,7 @@ abstract class OneSequenceGestureRecognizer extends GestureRecognizer {
void dispose() {
resolve(GestureDisposition.rejected);
for (final int pointer in _trackedPointers)
GestureBinding.instance.pointerRouter.removeRoute(pointer, handleEvent);
GestureBinding.instance!.pointerRouter.removeRoute(pointer, handleEvent);
_trackedPointers.clear();
assert(_entries.isEmpty);
super.dispose();
@ -294,10 +293,10 @@ abstract class OneSequenceGestureRecognizer extends GestureRecognizer {
/// A recognizer can be assigned to a team only when it is not participating
/// in the arena. For example, a common time to assign a recognizer to a team
/// is shortly after creating the recognizer.
GestureArenaTeam get team => _team;
GestureArenaTeam _team;
GestureArenaTeam? get team => _team;
GestureArenaTeam? _team;
/// The [team] can only be set once.
set team(GestureArenaTeam value) {
set team(GestureArenaTeam? value) {
assert(value != null);
assert(_entries.isEmpty);
assert(_trackedPointers.isEmpty);
@ -307,8 +306,8 @@ abstract class OneSequenceGestureRecognizer extends GestureRecognizer {
GestureArenaEntry _addPointerToArena(int pointer) {
if (_team != null)
return _team.add(pointer, this);
return GestureBinding.instance.gestureArena.add(pointer, this);
return _team!.add(pointer, this);
return GestureBinding.instance!.gestureArena.add(pointer, this);
}
/// Causes events related to the given pointer ID to be routed to this recognizer.
@ -321,8 +320,8 @@ abstract class OneSequenceGestureRecognizer extends GestureRecognizer {
///
/// Use [stopTrackingPointer] to remove the route added by this function.
@protected
void startTrackingPointer(int pointer, [Matrix4 transform]) {
GestureBinding.instance.pointerRouter.addRoute(pointer, handleEvent, transform);
void startTrackingPointer(int pointer, [Matrix4? transform]) {
GestureBinding.instance!.pointerRouter.addRoute(pointer, handleEvent, transform);
_trackedPointers.add(pointer);
assert(!_entries.containsValue(pointer));
_entries[pointer] = _addPointerToArena(pointer);
@ -337,7 +336,7 @@ abstract class OneSequenceGestureRecognizer extends GestureRecognizer {
@protected
void stopTrackingPointer(int pointer) {
if (_trackedPointers.contains(pointer)) {
GestureBinding.instance.pointerRouter.removeRoute(pointer, handleEvent);
GestureBinding.instance!.pointerRouter.removeRoute(pointer, handleEvent);
_trackedPointers.remove(pointer);
if (_trackedPointers.isEmpty)
didStopTrackingLastPointer(pointer);
@ -391,8 +390,8 @@ abstract class PrimaryPointerGestureRecognizer extends OneSequenceGestureRecogni
this.deadline,
this.preAcceptSlopTolerance = kTouchSlop,
this.postAcceptSlopTolerance = kTouchSlop,
Object debugOwner,
PointerDeviceKind kind,
Object? debugOwner,
PointerDeviceKind? kind,
}) : assert(
preAcceptSlopTolerance == null || preAcceptSlopTolerance >= 0,
'The preAcceptSlopTolerance must be positive or null',
@ -408,7 +407,7 @@ abstract class PrimaryPointerGestureRecognizer extends OneSequenceGestureRecogni
///
/// The [didExceedDeadline] will not be called if the primary pointer is
/// accepted, rejected, or all pointers are up or canceled before [deadline].
final Duration deadline;
final Duration? deadline;
/// The maximum distance in logical pixels the gesture is allowed to drift
/// from the initial touch down position before the gesture is accepted.
@ -417,7 +416,7 @@ abstract class PrimaryPointerGestureRecognizer extends OneSequenceGestureRecogni
///
/// Can be null to indicate that the gesture can drift for any distance.
/// Defaults to 18 logical pixels.
final double preAcceptSlopTolerance;
final double? preAcceptSlopTolerance;
/// The maximum distance in logical pixels the gesture is allowed to drift
/// after the gesture has been accepted.
@ -427,7 +426,7 @@ abstract class PrimaryPointerGestureRecognizer extends OneSequenceGestureRecogni
///
/// Can be null to indicate that the gesture can drift for any distance.
/// Defaults to 18 logical pixels.
final double postAcceptSlopTolerance;
final double? postAcceptSlopTolerance;
/// The current state of the recognizer.
///
@ -435,15 +434,15 @@ abstract class PrimaryPointerGestureRecognizer extends OneSequenceGestureRecogni
GestureRecognizerState state = GestureRecognizerState.ready;
/// The ID of the primary pointer this recognizer is tracking.
int primaryPointer;
int? primaryPointer;
/// The location at which the primary pointer contacted the screen.
OffsetPair initialPosition;
OffsetPair? initialPosition;
// Whether this pointer is accepted by winning the arena or as defined by
// a subclass calling acceptGesture.
bool _gestureAccepted = false;
Timer _timer;
Timer? _timer;
@override
void addAllowedPointer(PointerDownEvent event) {
@ -453,7 +452,7 @@ abstract class PrimaryPointerGestureRecognizer extends OneSequenceGestureRecogni
primaryPointer = event.pointer;
initialPosition = OffsetPair(local: event.localPosition, global: event.position);
if (deadline != null)
_timer = Timer(deadline, () => didExceedDeadlineWithEvent(event));
_timer = Timer(deadline!, () => didExceedDeadlineWithEvent(event));
}
}
@ -464,15 +463,15 @@ abstract class PrimaryPointerGestureRecognizer extends OneSequenceGestureRecogni
final bool isPreAcceptSlopPastTolerance =
!_gestureAccepted &&
preAcceptSlopTolerance != null &&
_getGlobalDistance(event) > preAcceptSlopTolerance;
_getGlobalDistance(event) > preAcceptSlopTolerance!;
final bool isPostAcceptSlopPastTolerance =
_gestureAccepted &&
postAcceptSlopTolerance != null &&
_getGlobalDistance(event) > postAcceptSlopTolerance;
_getGlobalDistance(event) > postAcceptSlopTolerance!;
if (event is PointerMoveEvent && (isPreAcceptSlopPastTolerance || isPostAcceptSlopPastTolerance)) {
resolve(GestureDisposition.rejected);
stopTrackingPointer(primaryPointer);
stopTrackingPointer(primaryPointer!);
} else {
handlePrimaryPointer(event);
}
@ -534,13 +533,13 @@ abstract class PrimaryPointerGestureRecognizer extends OneSequenceGestureRecogni
void _stopTimer() {
if (_timer != null) {
_timer.cancel();
_timer!.cancel();
_timer = null;
}
}
double _getGlobalDistance(PointerEvent event) {
final Offset offset = event.position - initialPosition.global;
final Offset offset = event.position - initialPosition!.global;
return offset.distance;
}
@ -559,8 +558,8 @@ abstract class PrimaryPointerGestureRecognizer extends OneSequenceGestureRecogni
class OffsetPair {
/// Creates a [OffsetPair] combining a [local] and [global] [Offset].
const OffsetPair({
@required this.local,
@required this.global,
required this.local,
required this.global,
});
/// Creates a [OffsetPair] from [PointerEvent.localPosition] and

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'dart:math' as math;
@ -38,7 +37,7 @@ class ScaleStartDetails {
/// Creates details for [GestureScaleStartCallback].
///
/// The [focalPoint] argument must not be null.
ScaleStartDetails({ this.focalPoint = Offset.zero, Offset localFocalPoint, })
ScaleStartDetails({ this.focalPoint = Offset.zero, Offset? localFocalPoint, })
: assert(focalPoint != null), localFocalPoint = localFocalPoint ?? focalPoint;
/// The initial focal point of the pointers in contact with the screen.
@ -75,7 +74,7 @@ class ScaleUpdateDetails {
/// argument must be greater than or equal to zero.
ScaleUpdateDetails({
this.focalPoint = Offset.zero,
Offset localFocalPoint,
Offset? localFocalPoint,
this.scale = 1.0,
this.horizontalScale = 1.0,
this.verticalScale = 1.0,
@ -225,37 +224,37 @@ class ScaleGestureRecognizer extends OneSequenceGestureRecognizer {
///
/// {@macro flutter.gestures.gestureRecognizer.kind}
ScaleGestureRecognizer({
Object debugOwner,
PointerDeviceKind kind,
Object? debugOwner,
PointerDeviceKind? kind,
}) : super(debugOwner: debugOwner, kind: kind);
/// The pointers in contact with the screen have established a focal point and
/// initial scale of 1.0.
GestureScaleStartCallback onStart;
GestureScaleStartCallback? onStart;
/// The pointers in contact with the screen have indicated a new focal point
/// and/or scale.
GestureScaleUpdateCallback onUpdate;
GestureScaleUpdateCallback? onUpdate;
/// The pointers are no longer in contact with the screen.
GestureScaleEndCallback onEnd;
GestureScaleEndCallback? onEnd;
_ScaleState _state = _ScaleState.ready;
Matrix4 _lastTransform;
Matrix4? _lastTransform;
Offset _initialFocalPoint;
Offset _currentFocalPoint;
double _initialSpan;
double _currentSpan;
double _initialHorizontalSpan;
double _currentHorizontalSpan;
double _initialVerticalSpan;
double _currentVerticalSpan;
_LineBetweenPointers _initialLine;
_LineBetweenPointers _currentLine;
Map<int, Offset> _pointerLocations;
List<int> _pointerQueue; // A queue to sort pointers in order of entrance
late Offset _initialFocalPoint;
late Offset _currentFocalPoint;
late double _initialSpan;
late double _currentSpan;
late double _initialHorizontalSpan;
late double _currentHorizontalSpan;
late double _initialVerticalSpan;
late double _currentVerticalSpan;
_LineBetweenPointers? _initialLine;
_LineBetweenPointers? _currentLine;
late Map<int, Offset> _pointerLocations;
late List<int> _pointerQueue; // A queue to sort pointers in order of entrance
final Map<int, VelocityTracker> _velocityTrackers = <int, VelocityTracker>{};
double get _scaleFactor => _initialSpan > 0.0 ? _currentSpan / _initialSpan : 1.0;
@ -268,15 +267,15 @@ class ScaleGestureRecognizer extends OneSequenceGestureRecognizer {
if (_initialLine == null || _currentLine == null) {
return 0.0;
}
final double fx = _initialLine.pointerStartLocation.dx;
final double fy = _initialLine.pointerStartLocation.dy;
final double sx = _initialLine.pointerEndLocation.dx;
final double sy = _initialLine.pointerEndLocation.dy;
final double fx = _initialLine!.pointerStartLocation.dx;
final double fy = _initialLine!.pointerStartLocation.dy;
final double sx = _initialLine!.pointerEndLocation.dx;
final double sy = _initialLine!.pointerEndLocation.dy;
final double nfx = _currentLine.pointerStartLocation.dx;
final double nfy = _currentLine.pointerStartLocation.dy;
final double nsx = _currentLine.pointerEndLocation.dx;
final double nsy = _currentLine.pointerEndLocation.dy;
final double nfx = _currentLine!.pointerStartLocation.dx;
final double nfy = _currentLine!.pointerStartLocation.dy;
final double nsx = _currentLine!.pointerEndLocation.dx;
final double nsy = _currentLine!.pointerEndLocation.dy;
final double angle1 = math.atan2(fy - sy, fx - sx);
final double angle2 = math.atan2(nfy - nsy, nfx - nsx);
@ -307,8 +306,7 @@ class ScaleGestureRecognizer extends OneSequenceGestureRecognizer {
bool didChangeConfiguration = false;
bool shouldStartIfAccepted = false;
if (event is PointerMoveEvent) {
final VelocityTracker tracker = _velocityTrackers[event.pointer];
assert(tracker != null);
final VelocityTracker tracker = _velocityTrackers[event.pointer]!;
if (!event.synthesized)
tracker.addPosition(event.timeStamp, event.position);
_pointerLocations[event.pointer] = event.position;
@ -341,7 +339,7 @@ class ScaleGestureRecognizer extends OneSequenceGestureRecognizer {
// Compute the focal point
Offset focalPoint = Offset.zero;
for (final int pointer in _pointerLocations.keys)
focalPoint += _pointerLocations[pointer];
focalPoint += _pointerLocations[pointer]!;
_currentFocalPoint = count > 0 ? focalPoint / count.toDouble() : Offset.zero;
// Span is the average deviation from focal point. Horizontal and vertical
@ -351,9 +349,9 @@ class ScaleGestureRecognizer extends OneSequenceGestureRecognizer {
double totalHorizontalDeviation = 0.0;
double totalVerticalDeviation = 0.0;
for (final int pointer in _pointerLocations.keys) {
totalDeviation += (_currentFocalPoint - _pointerLocations[pointer]).distance;
totalHorizontalDeviation += (_currentFocalPoint.dx - _pointerLocations[pointer].dx).abs();
totalVerticalDeviation += (_currentFocalPoint.dy - _pointerLocations[pointer].dy).abs();
totalDeviation += (_currentFocalPoint - _pointerLocations[pointer]!).distance;
totalHorizontalDeviation += (_currentFocalPoint.dx - _pointerLocations[pointer]!.dx).abs();
totalVerticalDeviation += (_currentFocalPoint.dy - _pointerLocations[pointer]!.dy).abs();
}
_currentSpan = count > 0 ? totalDeviation / count : 0.0;
_currentHorizontalSpan = count > 0 ? totalHorizontalDeviation / count : 0.0;
@ -369,22 +367,22 @@ class ScaleGestureRecognizer extends OneSequenceGestureRecognizer {
if (count < 2) {
_initialLine = _currentLine;
} else if (_initialLine != null &&
_initialLine.pointerStartId == _pointerQueue[0] &&
_initialLine.pointerEndId == _pointerQueue[1]) {
_initialLine!.pointerStartId == _pointerQueue[0] &&
_initialLine!.pointerEndId == _pointerQueue[1]) {
/// Rotation updated, set the [_currentLine]
_currentLine = _LineBetweenPointers(
pointerStartId: _pointerQueue[0],
pointerStartLocation: _pointerLocations[_pointerQueue[0]],
pointerStartLocation: _pointerLocations[_pointerQueue[0]]!,
pointerEndId: _pointerQueue[1],
pointerEndLocation: _pointerLocations[_pointerQueue[1]],
pointerEndLocation: _pointerLocations[_pointerQueue[1]]!,
);
} else {
/// A new rotation process is on the way, set the [_initialLine]
_initialLine = _LineBetweenPointers(
pointerStartId: _pointerQueue[0],
pointerStartLocation: _pointerLocations[_pointerQueue[0]],
pointerStartLocation: _pointerLocations[_pointerQueue[0]]!,
pointerEndId: _pointerQueue[1],
pointerEndLocation: _pointerLocations[_pointerQueue[1]],
pointerEndLocation: _pointerLocations[_pointerQueue[1]]!,
);
_currentLine = null;
}
@ -398,17 +396,16 @@ class ScaleGestureRecognizer extends OneSequenceGestureRecognizer {
_initialVerticalSpan = _currentVerticalSpan;
if (_state == _ScaleState.started) {
if (onEnd != null) {
final VelocityTracker tracker = _velocityTrackers[pointer];
assert(tracker != null);
final VelocityTracker tracker = _velocityTrackers[pointer]!;
Velocity velocity = tracker.getVelocity();
if (_isFlingGesture(velocity)) {
final Offset pixelsPerSecond = velocity.pixelsPerSecond;
if (pixelsPerSecond.distanceSquared > kMaxFlingVelocity * kMaxFlingVelocity)
velocity = Velocity(pixelsPerSecond: (pixelsPerSecond / pixelsPerSecond.distance) * kMaxFlingVelocity);
invokeCallback<void>('onEnd', () => onEnd(ScaleEndDetails(velocity: velocity)));
invokeCallback<void>('onEnd', () => onEnd!(ScaleEndDetails(velocity: velocity)));
} else {
invokeCallback<void>('onEnd', () => onEnd(ScaleEndDetails(velocity: Velocity.zero)));
invokeCallback<void>('onEnd', () => onEnd!(ScaleEndDetails(velocity: Velocity.zero)));
}
}
_state = _ScaleState.accepted;
@ -437,7 +434,7 @@ class ScaleGestureRecognizer extends OneSequenceGestureRecognizer {
if (_state == _ScaleState.started && onUpdate != null)
invokeCallback<void>('onUpdate', () {
onUpdate(ScaleUpdateDetails(
onUpdate!(ScaleUpdateDetails(
scale: _scaleFactor,
horizontalScale: _horizontalScaleFactor,
verticalScale: _verticalScaleFactor,
@ -452,7 +449,7 @@ class ScaleGestureRecognizer extends OneSequenceGestureRecognizer {
assert(_state == _ScaleState.started);
if (onStart != null)
invokeCallback<void>('onStart', () {
onStart(ScaleStartDetails(
onStart!(ScaleStartDetails(
focalPoint: _currentFocalPoint,
localFocalPoint: PointerEvent.transformPosition(_lastTransform, _currentFocalPoint),
));

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'package:vector_math/vector_math_64.dart' show Matrix4;
import 'package:flutter/foundation.dart';
@ -24,7 +23,7 @@ class TapDownDetails {
/// The [globalPosition] argument must not be null.
TapDownDetails({
this.globalPosition = Offset.zero,
Offset localPosition,
Offset? localPosition,
this.kind,
}) : assert(globalPosition != null),
localPosition = localPosition ?? globalPosition;
@ -33,7 +32,7 @@ class TapDownDetails {
final Offset globalPosition;
/// The kind of the device that initiated the event.
final PointerDeviceKind kind;
final PointerDeviceKind? kind;
/// The local position at which the pointer contacted the screen.
final Offset localPosition;
@ -61,7 +60,7 @@ class TapUpDetails {
/// The [globalPosition] argument must not be null.
TapUpDetails({
this.globalPosition = Offset.zero,
Offset localPosition,
Offset? localPosition,
}) : assert(globalPosition != null),
localPosition = localPosition ?? globalPosition;
@ -133,14 +132,14 @@ typedef GestureTapCancelCallback = void Function();
/// any buttons.
abstract class BaseTapGestureRecognizer extends PrimaryPointerGestureRecognizer {
/// Creates a tap gesture recognizer.
BaseTapGestureRecognizer({ Object debugOwner })
BaseTapGestureRecognizer({ Object? debugOwner })
: super(deadline: kPressTimeout , debugOwner: debugOwner);
bool _sentTapDown = false;
bool _wonArenaForPrimaryPointer = false;
PointerDownEvent _down;
PointerUpEvent _up;
PointerDownEvent? _down;
PointerUpEvent? _up;
/// A pointer has contacted the screen, which might be the start of a tap.
///
@ -153,7 +152,7 @@ abstract class BaseTapGestureRecognizer extends PrimaryPointerGestureRecognizer
/// If this recognizer doesn't win the arena, [handleTapCancel] is called next.
/// Otherwise, [handleTapUp] is called next.
@protected
void handleTapDown({ PointerDownEvent down });
void handleTapDown({ required PointerDownEvent down });
/// A pointer has stopped contacting the screen, which is recognized as a tap.
///
@ -166,7 +165,7 @@ abstract class BaseTapGestureRecognizer extends PrimaryPointerGestureRecognizer
/// If this recognizer doesn't win the arena, [handleTapCancel] is called
/// instead.
@protected
void handleTapUp({ PointerDownEvent down, PointerUpEvent up });
void handleTapUp({ required PointerDownEvent down, required PointerUpEvent up });
/// A pointer that previously triggered [handleTapDown] will not end up
/// causing a tap.
@ -182,7 +181,7 @@ abstract class BaseTapGestureRecognizer extends PrimaryPointerGestureRecognizer
///
/// If this recognizer wins the arena, [handleTapUp] is called instead.
@protected
void handleTapCancel({ PointerDownEvent down, PointerCancelEvent cancel, String reason });
void handleTapCancel({ required PointerDownEvent down, PointerCancelEvent? cancel, required String reason });
@override
void addAllowedPointer(PointerDownEvent event) {
@ -205,7 +204,7 @@ abstract class BaseTapGestureRecognizer extends PrimaryPointerGestureRecognizer
@override
@protected
void startTrackingPointer(int pointer, [Matrix4 transform]) {
void startTrackingPointer(int pointer, [Matrix4? transform]) {
// The recognizer should never track any pointers when `_down` is null,
// because calling `_checkDown` in this state will throw exception.
assert(_down != null);
@ -223,9 +222,9 @@ abstract class BaseTapGestureRecognizer extends PrimaryPointerGestureRecognizer
_checkCancel(event, '');
}
_reset();
} else if (event.buttons != _down.buttons) {
} else if (event.buttons != _down!.buttons) {
resolve(GestureDisposition.rejected);
stopTrackingPointer(primaryPointer);
stopTrackingPointer(primaryPointer!);
}
}
@ -273,7 +272,7 @@ abstract class BaseTapGestureRecognizer extends PrimaryPointerGestureRecognizer
if (_sentTapDown) {
return;
}
handleTapDown(down: _down);
handleTapDown(down: _down!);
_sentTapDown = true;
}
@ -281,12 +280,12 @@ abstract class BaseTapGestureRecognizer extends PrimaryPointerGestureRecognizer
if (!_wonArenaForPrimaryPointer || _up == null) {
return;
}
handleTapUp(down: _down, up: _up);
handleTapUp(down: _down!, up: _up!);
_reset();
}
void _checkCancel(PointerCancelEvent event, String note) {
handleTapCancel(down: _down, cancel: event, reason: note);
void _checkCancel(PointerCancelEvent? event, String note) {
handleTapCancel(down: _down!, cancel: event, reason: note);
}
void _reset() {
@ -332,7 +331,7 @@ abstract class BaseTapGestureRecognizer extends PrimaryPointerGestureRecognizer
/// * [MultiTapGestureRecognizer]
class TapGestureRecognizer extends BaseTapGestureRecognizer {
/// Creates a tap gesture recognizer.
TapGestureRecognizer({ Object debugOwner }) : super(debugOwner: debugOwner);
TapGestureRecognizer({ Object? debugOwner }) : super(debugOwner: debugOwner);
/// A pointer has contacted the screen at a particular location with a primary
/// button, which might be the start of a tap.
@ -349,7 +348,7 @@ class TapGestureRecognizer extends BaseTapGestureRecognizer {
/// * [onSecondaryTapDown], a similar callback but for a secondary button.
/// * [TapDownDetails], which is passed as an argument to this callback.
/// * [GestureDetector.onTapDown], which exposes this callback.
GestureTapDownCallback onTapDown;
GestureTapDownCallback? onTapDown;
/// A pointer has stopped contacting the screen at a particular location,
/// which is recognized as a tap of a primary button.
@ -365,7 +364,7 @@ class TapGestureRecognizer extends BaseTapGestureRecognizer {
/// * [onSecondaryTapUp], a similar callback but for a secondary button.
/// * [TapUpDetails], which is passed as an argument to this callback.
/// * [GestureDetector.onTapUp], which exposes this callback.
GestureTapUpCallback onTapUp;
GestureTapUpCallback? onTapUp;
/// A pointer has stopped contacting the screen, which is recognized as a tap
/// of a primary button.
@ -380,7 +379,7 @@ class TapGestureRecognizer extends BaseTapGestureRecognizer {
/// * [kPrimaryButton], the button this callback responds to.
/// * [onTapUp], which has the same timing but with details.
/// * [GestureDetector.onTap], which exposes this callback.
GestureTapCallback onTap;
GestureTapCallback? onTap;
/// A pointer that previously triggered [onTapDown] will not end up causing
/// a tap.
@ -396,7 +395,7 @@ class TapGestureRecognizer extends BaseTapGestureRecognizer {
/// * [kPrimaryButton], the button this callback responds to.
/// * [onSecondaryTapCancel], a similar callback but for a secondary button.
/// * [GestureDetector.onTapCancel], which exposes this callback.
GestureTapCancelCallback onTapCancel;
GestureTapCancelCallback? onTapCancel;
/// A pointer has stopped contacting the screen, which is recognized as a tap
/// of a secondary button.
@ -412,7 +411,7 @@ class TapGestureRecognizer extends BaseTapGestureRecognizer {
/// * [kSecondaryButton], the button this callback responds to.
/// * [onSecondaryTapUp], which has the same timing but with details.
/// * [GestureDetector.onSecondaryTap], which exposes this callback.
GestureTapCallback onSecondaryTap;
GestureTapCallback? onSecondaryTap;
/// A pointer has contacted the screen at a particular location with a
/// secondary button, which might be the start of a secondary tap.
@ -429,7 +428,7 @@ class TapGestureRecognizer extends BaseTapGestureRecognizer {
/// * [onTapDown], a similar callback but for a primary button.
/// * [TapDownDetails], which is passed as an argument to this callback.
/// * [GestureDetector.onSecondaryTapDown], which exposes this callback.
GestureTapDownCallback onSecondaryTapDown;
GestureTapDownCallback? onSecondaryTapDown;
/// A pointer has stopped contacting the screen at a particular location,
/// which is recognized as a tap of a secondary button.
@ -448,7 +447,7 @@ class TapGestureRecognizer extends BaseTapGestureRecognizer {
/// * [onTapUp], a similar callback but for a primary button.
/// * [TapUpDetails], which is passed as an argument to this callback.
/// * [GestureDetector.onSecondaryTapUp], which exposes this callback.
GestureTapUpCallback onSecondaryTapUp;
GestureTapUpCallback? onSecondaryTapUp;
/// A pointer that previously triggered [onSecondaryTapDown] will not end up
/// causing a tap.
@ -463,7 +462,7 @@ class TapGestureRecognizer extends BaseTapGestureRecognizer {
/// * [kSecondaryButton], the button this callback responds to.
/// * [onTapCancel], a similar callback but for a primary button.
/// * [GestureDetector.onTapCancel], which exposes this callback.
GestureTapCancelCallback onSecondaryTapCancel;
GestureTapCancelCallback? onSecondaryTapCancel;
@override
bool isPointerAllowed(PointerDownEvent event) {
@ -490,7 +489,7 @@ class TapGestureRecognizer extends BaseTapGestureRecognizer {
@protected
@override
void handleTapDown({PointerDownEvent down}) {
void handleTapDown({required PointerDownEvent down}) {
final TapDownDetails details = TapDownDetails(
globalPosition: down.position,
localPosition: down.localPosition,
@ -499,11 +498,11 @@ class TapGestureRecognizer extends BaseTapGestureRecognizer {
switch (down.buttons) {
case kPrimaryButton:
if (onTapDown != null)
invokeCallback<void>('onTapDown', () => onTapDown(details));
invokeCallback<void>('onTapDown', () => onTapDown!(details));
break;
case kSecondaryButton:
if (onSecondaryTapDown != null)
invokeCallback<void>('onSecondaryTapDown', () => onSecondaryTapDown(details));
invokeCallback<void>('onSecondaryTapDown', () => onSecondaryTapDown!(details));
break;
default:
}
@ -511,7 +510,7 @@ class TapGestureRecognizer extends BaseTapGestureRecognizer {
@protected
@override
void handleTapUp({PointerDownEvent down, PointerUpEvent up}) {
void handleTapUp({ required PointerDownEvent down, required PointerUpEvent up}) {
final TapUpDetails details = TapUpDetails(
globalPosition: up.position,
localPosition: up.localPosition,
@ -519,15 +518,15 @@ class TapGestureRecognizer extends BaseTapGestureRecognizer {
switch (down.buttons) {
case kPrimaryButton:
if (onTapUp != null)
invokeCallback<void>('onTapUp', () => onTapUp(details));
invokeCallback<void>('onTapUp', () => onTapUp!(details));
if (onTap != null)
invokeCallback<void>('onTap', onTap);
invokeCallback<void>('onTap', onTap!);
break;
case kSecondaryButton:
if (onSecondaryTapUp != null)
invokeCallback<void>('onSecondaryTapUp', () => onSecondaryTapUp(details));
invokeCallback<void>('onSecondaryTapUp', () => onSecondaryTapUp!(details));
if (onSecondaryTap != null)
invokeCallback<void>('onSecondaryTap', () => onSecondaryTap());
invokeCallback<void>('onSecondaryTap', () => onSecondaryTap!());
break;
default:
}
@ -535,16 +534,16 @@ class TapGestureRecognizer extends BaseTapGestureRecognizer {
@protected
@override
void handleTapCancel({PointerDownEvent down, PointerCancelEvent cancel, String reason}) {
void handleTapCancel({ required PointerDownEvent down, PointerCancelEvent? cancel, required String reason }) {
final String note = reason == '' ? reason : '$reason ';
switch (down.buttons) {
case kPrimaryButton:
if (onTapCancel != null)
invokeCallback<void>('${note}onTapCancel', onTapCancel);
invokeCallback<void>('${note}onTapCancel', onTapCancel!);
break;
case kSecondaryButton:
if (onSecondaryTapCancel != null)
invokeCallback<void>('${note}onSecondaryTapCancel', onSecondaryTapCancel);
invokeCallback<void>('${note}onSecondaryTapCancel', onSecondaryTapCancel!);
break;
default:
}

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'arena.dart';
import 'binding.dart';
@ -27,8 +26,8 @@ class _CombiningGestureArenaMember extends GestureArenaMember {
final int _pointer;
bool _resolved = false;
GestureArenaMember _winner;
GestureArenaEntry _entry;
GestureArenaMember? _winner;
GestureArenaEntry? _entry;
@override
void acceptGesture(int pointer) {
@ -40,7 +39,7 @@ class _CombiningGestureArenaMember extends GestureArenaMember {
if (member != _winner)
member.rejectGesture(pointer);
}
_winner.acceptGesture(pointer);
_winner!.acceptGesture(pointer);
}
@override
@ -54,7 +53,7 @@ class _CombiningGestureArenaMember extends GestureArenaMember {
void _close() {
assert(!_resolved);
_resolved = true;
final _CombiningGestureArenaMember combiner = _owner._combiners.remove(_pointer);
final _CombiningGestureArenaMember? combiner = _owner._combiners.remove(_pointer);
assert(combiner == this);
}
@ -62,7 +61,7 @@ class _CombiningGestureArenaMember extends GestureArenaMember {
assert(!_resolved);
assert(_pointer == pointer);
_members.add(member);
_entry ??= GestureBinding.instance.gestureArena.add(pointer, this);
_entry ??= GestureBinding.instance!.gestureArena.add(pointer, this);
return _CombiningGestureArenaEntry(this, member);
}
@ -73,11 +72,11 @@ class _CombiningGestureArenaMember extends GestureArenaMember {
_members.remove(member);
member.rejectGesture(_pointer);
if (_members.isEmpty)
_entry.resolve(disposition);
_entry!.resolve(disposition);
} else {
assert(disposition == GestureDisposition.accepted);
_winner ??= _owner.captain ?? member;
_entry.resolve(disposition);
_entry!.resolve(disposition);
}
}
}
@ -131,7 +130,7 @@ class GestureArenaTeam {
/// If not null, when any one of the [GestureArenaTeam] members claims victory
/// the captain accepts the gesture.
/// If null, the member that claims a victory accepts the gesture.
GestureArenaMember captain;
GestureArenaMember? captain;
/// Adds a new member to the arena on behalf of this team.
///

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'dart:ui' show Offset;
@ -19,7 +18,7 @@ class Velocity {
///
/// The [pixelsPerSecond] argument must not be null.
const Velocity({
@required this.pixelsPerSecond,
required this.pixelsPerSecond,
}) : assert(pixelsPerSecond != null);
/// A velocity that isn't moving at all.
@ -95,10 +94,10 @@ class VelocityEstimate {
///
/// [pixelsPerSecond], [confidence], [duration], and [offset] must not be null.
const VelocityEstimate({
@required this.pixelsPerSecond,
@required this.confidence,
@required this.duration,
@required this.offset,
required this.pixelsPerSecond,
required this.confidence,
required this.duration,
required this.offset,
}) : assert(pixelsPerSecond != null),
assert(confidence != null),
assert(duration != null),
@ -154,7 +153,7 @@ class VelocityTracker {
static const int _minSampleSize = 3;
// Circular buffer; current sample at _index.
final List<_PointAtTime> _samples = List<_PointAtTime>(_historySize);
final List<_PointAtTime?> _samples = List<_PointAtTime?>.filled(_historySize, null, growable: false);
int _index = 0;
/// Adds a position as the given time to the tracker.
@ -171,7 +170,7 @@ class VelocityTracker {
/// Information is added using [addPosition].
///
/// Returns null if there is no data on which to base an estimate.
VelocityEstimate getVelocityEstimate() {
VelocityEstimate? getVelocityEstimate() {
final List<double> x = <double>[];
final List<double> y = <double>[];
final List<double> w = <double>[];
@ -179,7 +178,7 @@ class VelocityTracker {
int sampleCount = 0;
int index = _index;
final _PointAtTime newestSample = _samples[index];
final _PointAtTime? newestSample = _samples[index];
if (newestSample == null)
return null;
@ -189,7 +188,7 @@ class VelocityTracker {
// Starting with the most recent PointAtTime sample, iterate backwards while
// the samples represent continuous motion.
do {
final _PointAtTime sample = _samples[index];
final _PointAtTime? sample = _samples[index];
if (sample == null)
break;
@ -212,10 +211,10 @@ class VelocityTracker {
if (sampleCount >= _minSampleSize) {
final LeastSquaresSolver xSolver = LeastSquaresSolver(time, x, w);
final PolynomialFit xFit = xSolver.solve(2);
final PolynomialFit? xFit = xSolver.solve(2);
if (xFit != null) {
final LeastSquaresSolver ySolver = LeastSquaresSolver(time, y, w);
final PolynomialFit yFit = ySolver.solve(2);
final PolynomialFit? yFit = ySolver.solve(2);
if (yFit != null) {
return VelocityEstimate( // convert from pixels/ms to pixels/s
pixelsPerSecond: Offset(xFit.coefficients[1] * 1000, yFit.coefficients[1] * 1000),
@ -245,7 +244,7 @@ class VelocityTracker {
/// Returns [Velocity.zero] if there is no data from which to compute an
/// estimate or if the estimated velocity is zero.
Velocity getVelocity() {
final VelocityEstimate estimate = getVelocityEstimate();
final VelocityEstimate? estimate = getVelocityEstimate();
if (estimate == null || estimate.pixelsPerSecond == Offset.zero)
return Velocity.zero;
return Velocity(pixelsPerSecond: estimate.pixelsPerSecond);