assert(!_debugChildTaken);// we shouldn't be able to lose our child when we're syncing it!
assert(_child!=null);
assert(_child.parent==this);
try{
// even if build() failed (i.e. _child == null), we still call syncChild(), to remove the oldChild
_child=syncChild(_child,oldChild,slot);
assert(!_debugChildTaken);// we shouldn't be able to lose our child when we're syncing it!
assert(_child==null||_child.parent==this);
}catch(e,stack){
_debugReportException('syncing build output of ${this.toStringName()}\n old child: ${oldChild?.toStringName()}\n new child: ${_child?.toStringName()}',e,stack);