anchor.diff:          child: FittedBox(
               fit: widget.objectFit == RTCVideoViewObjectFit.RTCVideoViewObjectFitContain ? BoxFit.contain : BoxFit.cover,
               child: Center(
  -                child: SizedBox(
  -                    width: constraints.maxHeight * _aspectRatio,
  -                    height: constraints.maxHeight,
  -                    child: Transform(
  -                        transform: Matrix4.identity()
  -                          ..rotateY(widget.mirror ? -pi : 0.0),
  -                        alignment: FractionalOffset.center,
  -                        child:
  -                            Texture(textureId: widget._renderer._textureId))))));
  +              child: ValueListenableBuilder<RTCVideoValue>(
  +                  valueListenable: widget._renderer,
  +                  builder: (BuildContext context, RTCVideoValue value, Widget child) {
  +                    return SizedBox(
  +                      width: constraints.maxHeight * value.aspectRatio,
  +                      height: constraints.maxHeight,
  +                      child: child,
  +                    );
  +                  },
  +                  child: Transform(
  +                      transform: Matrix4.identity()
  +                        ..rotateY(widget.mirror ? -pi : 0.0),
  +                      alignment: FractionalOffset.center,
  +                      child: Texture(textureId: widget._renderer._textureId))),
  +            )));
     }
   
     @override
  
positive.code:     final Map<dynamic, dynamic> map = event;
      switch (map['event']) {
        case 'didTextureChangeRotation':
          _rotation = map['rotation'];
          break;
        case 'didTextureChangeVideoSize':
          _width = 0.0 + map['width'];
          _height = 0.0 + map['height'];
          break;
        case 'didFirstFrameRendered':
          break;
      }
      if (this.onStateChanged != null) {
        this.onStateChanged();
      }
    }
  
  
negative.code: import 'utils.dart';
  import 'enums.dart';
  
  @immutable
  class RTCVideoValue {
    static const RTCVideoValue empty = RTCVideoValue();
  
    final double width;
    final double height;
    final int rotation;
  
    const RTCVideoValue({
      this.width = 0.0,
      this.height = 0.0,
      this.rotation = 0,
    });
  
    double get aspectRatio {
      if (width == 0.0 || height == 0.0) {
        return 1.0;
      } else {
        return (rotation == 90 || rotation == 270) ? height / width : width / height;
      }
    }
  
    RTCVideoValue copyWith({
      double width,
      double height,
      int rotation,
    }) {
      return RTCVideoValue(
        width: width ?? this.width,
        height: height ?? this.height,
        rotation: rotation ?? this.rotation,
      );
    }
  
    @override
    String toString() => '$runtimeType(width: $width, height: $height, rotation: $rotation)';
  }
  
  class RTCVideoRenderer extends ValueNotifier<RTCVideoValue> {
    MethodChannel _channel = WebRTC.methodChannel();
    int _textureId;
    MediaStream _srcObject;
    StreamSubscription<dynamic> _eventSubscription;
  
    RTCVideoRenderer() : super(RTCVideoValue.empty);
  
    initialize() async {
      final Map<dynamic, dynamic> response =
  