anchor.diff:  }
   
   /// An element that uses a [RenderObjectWidget] as its configuration.
  +///
  +/// [RenderObjectElement] objects have an associated [RenderObject] widget in
  +/// the render tree, which handles concrete operations like laying out,
  +/// painting, and hit testing.
  +///
  +/// Contrast with [ComponentElement].
   abstract class RenderObjectElement extends BuildableElement {
     /// Creates an element that uses the given widget as its configuration.
     RenderObjectElement(RenderObjectWidget widget) : super(widget);
  
positive.code: ///
  /// Rather than creating a [RenderObject] directly, a [ComponentElement] creates
  /// [RenderObject]s indirectly by creating other [Element]s.
  abstract class ComponentElement extends BuildableElement {
    /// Creates an element that uses the given widget as its configuration.
    ComponentElement(Widget widget) : super(widget);
  
negative.code:     assert(_debugLifecycleState == _ElementLifecycle.active);
      assert(() {
        if (owner._debugBuilding) {
          assert(owner._debugCurrentBuildTarget != null);
          assert(owner._debugStateLocked);
          if (_debugIsInScope(owner._debugCurrentBuildTarget))
            return true;
          if (!_debugAllowIgnoredCallsToMarkNeedsBuild) {
            throw new FlutterError(
              'setState() or markNeedsBuild() called during build.\n'
              'This ${widget.runtimeType} widget cannot be marked as needing to build because the framework '
              'is already in the process of building widgets. A widget can be marked as '
              'needing to be built during the build phase only if one of its ancestors '
              'is currently building. This exception is allowed because the framework '
              'builds parent widgets before children, which means a dirty descendant '
              'will always be built. Otherwise, the framework might not visit this '
              'widget during this build phase.\n'
              'The widget on which setState() or markNeedsBuild() was called was:\n'
              '  $this\n'
              '${owner._debugCurrentBuildTarget == null ? "" : "The widget which was currently being built when the offending call was made was:\n  ${owner._debugCurrentBuildTarget}"}'
            );
          }
          assert(dirty); // can only get here if we're not in scope, but ignored calls are allowed, and our call would somehow be ignored (since we're already dirty)
        } else if (owner._debugStateLocked) {
          assert(!_debugAllowIgnoredCallsToMarkNeedsBuild);
          throw new FlutterError(
            'setState() or markNeedsBuild() called when widget tree was locked.\n'
            'This ${widget.runtimeType} widget cannot be marked as needing to build '
            'because the framework is locked.\n'
            'The widget on which setState() or markNeedsBuild() was called was:\n'
            '  $this\n'
          );
        }
        return true;
  