anchor.diff:        ..team = team
         ..onStart = _handleDragStart
         ..onUpdate = _handleDragUpdate
  -      ..onEnd = _handleDragEnd;
  +      ..onEnd = _handleDragEnd
  +      ..onCancel = _endInteraction;
       _tap = new TapGestureRecognizer()
         ..team = team
  -      ..onTapCancel = _endInteraction
         ..onTapDown = _handleTapDown
  -      ..onTapUp = _handleTapUp;
  +      ..onTapUp = _handleTapUp
  +      ..onTapCancel = _endInteraction;
       _reaction = new CurvedAnimation(parent: state.reactionController, curve: Curves.fastOutSlowIn)
         ..addListener(markNeedsPaint);
       state.enableController.value = isInteractive ? 1.0 : 0.0;
  
positive.code:           break;
        }
        onChanged(_discretize(_currentDragValue));
      }
    }
  
  
negative.code: 
    void _handleChanged(double value) {
      assert(widget.onChanged != null);
      final double lerpValue = _lerp(value);
      if (lerpValue != widget.value) {
        widget.onChanged(lerpValue);
      }
    }
  
    // Returns a number between min and max, proportional to value, which must
  