publish method
Replaces the live violation set. Returns true when the set
actually changed (and listeners were notified), false for a
no-op publish.
Publishing an empty list clears the banner — the revert path.
Implementation
bool publish(List<SkinViolation> violations) {
final changed = !_equal(_violations, violations);
if (!changed) return false;
_violations = List.unmodifiable(violations);
if (_violations.isNotEmpty || _history.isNotEmpty) {
// Record every real transition, including the clear (the
// revert receipt), but never a no-op.
_history.add(List.unmodifiable(violations));
while (_history.length > _historyLimit) {
_history.removeAt(0);
}
}
_notify();
return true;
}