anchor.diff:      else if (_cursorTimer != null && (!focused || !config.value.selection.isCollapsed))
         _stopCursorTimer();
   
  -    if (_selectionHandles != null && !focused) {
  -      scheduleMicrotask(() { // can't hide while disposing, since it triggers a rebuild
  -        _selectionHandles.hide();
  -        _selectionHandles = null;
  +    if (_selectionHandles != null) {
  +      scheduleMicrotask(() { // can't update while disposing, since it triggers a rebuild
  +        if (focused) {
  +          _selectionHandles.update(config.value.selection);
  +        } else {
  +          _selectionHandles.hide();
  +          _selectionHandles = null;
  +        }
         });
       }
   
  
positive.code:     // EditableLineWidget, not just changes triggered by user gestures.
      requestKeyboard();
  
      if (config.onChanged != null)
        config.onChanged(_keyboardClient.inputValue.copyWith(selection: selection));
  
      if (_selectionHandles != null) {
        _selectionHandles.hide();
        _selectionHandles = null;
      }
  
      if (_selectionHandles == null &&
          _keyboardClient.inputValue.text.isNotEmpty &&
          config.selectionHandleBuilder != null) {
        _selectionHandles = new TextSelectionHandles(
          selection: selection,
  
negative.code:   }
  
    void _handleSelectionHandleChanged(TextSelection selection) {
      InputValue newInput = new InputValue(text: _keyboardClient.inputValue.text, selection: selection);
      if (config.onChanged != null)
        config.onChanged(newInput);
    }
  
    /// Whether the blinking cursor is actually visible at this precise moment
  