flushSemantics method

void flushSemantics()

Update the semantics for render objects marked as needing a semantics update.

Initially, only the root node, as scheduled by RenderObject.scheduleInitialSemantics, needs a semantics update.

This function is one of the core stages of the rendering pipeline. The semantics are compiled after painting and only after RenderObject.scheduleInitialSemantics has been called.

See RendererBinding for an example of how this function is used.

Implementation

void flushSemantics() {
  if (_semanticsOwner == null) {
    return;
  }
  if (!kReleaseMode) {
    FlutterTimeline.startSync('SEMANTICS$_debugRootSuffixForTimelineEventNames');
  }
  assert(_semanticsOwner != null);
  assert(() {
    _debugDoingSemantics = true;
    return true;
  }());
  try {
    final List<RenderObject> nodesToProcess = _nodesNeedingSemantics.toList()
      ..sort((RenderObject a, RenderObject b) => a.depth - b.depth);
    _nodesNeedingSemantics.clear();
    for (final RenderObject node in nodesToProcess) {
      if (node._needsSemanticsUpdate && node.owner == this) {
        node._updateSemantics();
      }
    }
    _semanticsOwner!.sendSemanticsUpdate();
    for (final PipelineOwner child in _children) {
      child.flushSemantics();
    }
    assert(_nodesNeedingSemantics.isEmpty, 'Child PipelineOwners must not dirty nodes in their parent.');
  } finally {
    assert(() {
      _debugDoingSemantics = false;
      return true;
    }());
    if (!kReleaseMode) {
      FlutterTimeline.finishSync();
    }
  }
}