ensureButtonBindings method

void ensureButtonBindings({
  1. required String page,
  2. required BrownfieldPatternTarget button,
  3. Object? text,
  4. Object? visibleWhen,
})

Binds an existing button's text and/or visibility to expressions.

Use this when you want a small rerunnable update on one existing button instead of rebuilding the surrounding layout.

Example:

app.ensureButtonBindings(
  page: 'TaskListPage',
  button: BrownfieldPatternTarget.singleExistingButton(),
  text: State('ctaLabel'),
  visibleWhen: State('showCta'),
);

Implementation

void ensureButtonBindings({
  required String page,
  required BrownfieldPatternTarget button,
  Object? text,
  Object? visibleWhen,
}) {
  if (text == null && visibleWhen == null) {
    throw ArgumentError(
      'ensureButtonBindings(...) requires at least one of text or visibleWhen.',
    );
  }
  recordExistingReference(
    name: page,
    kind: 'page',
    referenceApi: 'ensureButtonBindings',
    removeApi: 'removePage',
  );
  raw((project) {
    final editor = _pagePatternEditor(page);
    final pageSnapshot = _requirePagePatternSnapshot(project, page);
    final buttonRef = _resolveTypedPatternTarget(
      pageSnapshot,
      editor,
      button,
      operation: 'ensureButtonBindings(button: ...)',
      allowedTypes: {FFWidgetType.Button.name, FFWidgetType.IconButton.name},
    );
    final selection = _selectionForResolvedTarget(editor, buttonRef);
    if (text != null) {
      if (buttonRef.type != FFWidgetType.Button.name) {
        throw StateError(
          'ensureButtonBindings(text: ...) requires a Button target, but '
          'matched ${buttonRef.type} at ${buttonRef.path}.',
        );
      }
      editor.bindText(selection, text);
    }
    if (visibleWhen != null) {
      editor.bindVisible(selection, visibleWhen);
    }
    _applyBrownfieldWidgetClassEdit(project, editor);
  });
}