setTrap method

void setTrap(
  1. String? id
)

Sets or clears the focus trap.

When a trap is set, focus requests for IDs outside the trap's subtree will be ignored. The currently focused ID is saved so it can be restored when the trap is cleared.

Implementation

void setTrap(String? id) {
  if (TuiTrace.enabled) {
    TuiTrace.log(
      'focus.setTrap id=$id prev=$_trapId focusedId=$_focusedId savedFocus=$_savedFocusId',
    );
  }
  if (id != null && _trapId == null) {
    _savedFocusId = _focusedId;
    if (TuiTrace.enabled) {
      TuiTrace.log('focus.setTrap saved=$_savedFocusId');
    }
  } else if (id == null && _trapId != null) {
    final restore = _savedFocusId;
    _savedFocusId = null;
    _trapId = null;
    if (TuiTrace.enabled) {
      TuiTrace.log(
        'focus.setTrap clearing restore=$restore ids=$_focusableIds focusedId=$_focusedId',
      );
    }
    if (restore != null && _focusableIds.contains(restore)) {
      _focusedId = restore;
      if (TuiTrace.enabled) {
        TuiTrace.log('focus.setTrap restored focusedId=$_focusedId');
      }
      _notify();
      return;
    }
    // Saved ID was stale (widget was recreated with a new ID) — clear
    // focus so the next autofocus widget can claim it.
    _focusedId = null;
    if (TuiTrace.enabled) {
      TuiTrace.log('focus.setTrap stale-restore, cleared focusedId');
    }
    _notify();
    return;
  }
  _trapId = id;
}