anchor.diff:        showWidget = !showWidget;
         _hostState._setStateTrampoline();
       } else {
  -      _profileCompleter.complete(profile);
  +      didStop();
  +      _runCompleter.complete();
       }
     }
   
     @override
     void _onError(dynamic error, StackTrace stackTrace) {
  -    _profileCompleter.completeError(error, stackTrace);
  -  }
  -
  -  @override
  -  Future<Profile> run() {
  -    profile = Profile(name: name);
  +    _runCompleter.completeError(error, stackTrace);
  +  }
  +
  +  @override
  +  Future<Profile> run() async {
  +    _runCompleter = Completer<void>();
  +    final Profile localProfile = profile = Profile(name: name);
       final _RecordingWidgetsBinding binding =
           _RecordingWidgetsBinding.ensureInitialized();
       binding._beginRecording(this, _WidgetBuildRecorderHost(this));
   
  -    _profileCompleter.future.whenComplete(() {
  +    try {
  +      await _runCompleter.future;
  +      return localProfile;
  +    } finally {
  +      _runCompleter = null;
         profile = null;
  -    });
  -    return _profileCompleter.future;
  +    }
     }
   }
   
  
positive.code: 
  /// Implemented by recorders that use [_RecordingWidgetsBinding] to receive
  /// frame life-cycle calls.
  abstract class RecordingWidgetsBindingListener {
    /// The profile where the benchmark is collecting metrics.
    Profile profile;
  
    /// Called just before calling [SchedulerBinding.handleDrawFrame].
    void frameWillDraw();
  
negative.code: /// another frame that clears the screen. It repeats this process, measuring the
  /// performance of frames that render the widget and ignoring the frames that
  /// clear the screen.
  abstract class WidgetBuildRecorder extends Recorder implements FrameRecorder {
    WidgetBuildRecorder({@required String name}) : super._(name);
  
    /// Creates a widget to be benchmarked.
  