@@ -82,6 +82,7 @@ class RTCVideoRenderer extends ValueNotifier<RTCVideoValue> {
82
82
final int textureId;
83
83
html.VideoElement videoElement;
84
84
MediaStream _srcObject;
85
+ final _subscriptions = < StreamSubscription > [];
85
86
86
87
bool get muted => videoElement? .muted ?? true ;
87
88
@@ -104,40 +105,57 @@ class RTCVideoRenderer extends ValueNotifier<RTCVideoValue> {
104
105
ui.platformViewRegistry.registerViewFactory (
105
106
'RTCVideoRenderer-$textureId ' , (int viewId) => videoElement);
106
107
107
- videoElement.onCanPlay. listen (( dynamic _) {
108
- value = value. copyWith (
109
- rotation : 0 ,
110
- width : videoElement.videoWidth. toDouble () ?? 0.0 ,
111
- height : videoElement.videoHeight. toDouble () ?? 0.0 ,
112
- renderVideo : renderVideo);
113
- print ( 'RTCVideoRenderer: videoElement.onCanPlay ${ value . toString ()}' );
114
- } );
108
+ _subscriptions. add (
109
+ videoElement.onCanPlay. listen (
110
+ ( dynamic _) {
111
+ _updateAllValues ();
112
+ print ( 'RTCVideoRenderer : videoElement.onCanPlay ${ value . toString ()}' );
113
+ },
114
+ ),
115
+ );
115
116
116
- videoElement.onResize. listen (( dynamic _) {
117
- value = value. copyWith (
118
- rotation : 0 ,
119
- width : videoElement.videoWidth. toDouble () ?? 0.0 ,
120
- height : videoElement.videoHeight. toDouble () ?? 0.0 ,
121
- renderVideo : renderVideo);
122
- print ( 'RTCVideoRenderer: videoElement.onResize ${ value . toString ()}' );
123
- } );
117
+ _subscriptions. add (
118
+ videoElement.onResize. listen (
119
+ ( dynamic _) {
120
+ _updateAllValues ();
121
+ print ( 'RTCVideoRenderer : videoElement.onResize ${ value . toString ()}' );
122
+ },
123
+ ),
124
+ );
124
125
125
126
// The error event fires when some form of error occurs while attempting to load or perform the media.
126
- videoElement.onError.listen ((html.Event _) {
127
- // The Event itself (_) doesn't contain info about the actual error.
128
- // We need to look at the HTMLMediaElement.error.
129
- // See: https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/error
130
- var error = videoElement.error;
131
- throw PlatformException (
132
- code: _kErrorValueToErrorName[error.code],
133
- message: error.message != '' ? error.message : _kDefaultErrorMessage,
134
- details: _kErrorValueToErrorDescription[error.code],
135
- );
136
- });
127
+ _subscriptions.add (
128
+ videoElement.onError.listen (
129
+ (html.Event _) {
130
+ // The Event itself (_) doesn't contain info about the actual error.
131
+ // We need to look at the HTMLMediaElement.error.
132
+ // See: https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/error
133
+ var error = videoElement.error;
134
+ throw PlatformException (
135
+ code: _kErrorValueToErrorName[error.code],
136
+ message:
137
+ error.message != '' ? error.message : _kDefaultErrorMessage,
138
+ details: _kErrorValueToErrorDescription[error.code],
139
+ );
140
+ },
141
+ ),
142
+ );
137
143
138
- videoElement.onEnded.listen ((dynamic _) {
139
- print ('RTCVideoRenderer: videoElement.onEnded' );
140
- });
144
+ _subscriptions.add (
145
+ videoElement.onEnded.listen (
146
+ (dynamic _) {
147
+ print ('RTCVideoRenderer: videoElement.onEnded' );
148
+ },
149
+ ),
150
+ );
151
+ }
152
+
153
+ void _updateAllValues () {
154
+ value = value.copyWith (
155
+ rotation: 0 ,
156
+ width: videoElement? .videoWidth? .toDouble () ?? 0.0 ,
157
+ height: videoElement? .videoHeight? .toDouble () ?? 0.0 ,
158
+ renderVideo: renderVideo);
141
159
}
142
160
143
161
MediaStream get srcObject => _srcObject;
@@ -161,6 +179,7 @@ class RTCVideoRenderer extends ValueNotifier<RTCVideoValue> {
161
179
super .dispose ();
162
180
await _srcObject? .dispose ();
163
181
_srcObject = null ;
182
+ _subscriptions.forEach ((s) => s.cancel ());
164
183
videoElement.removeAttribute ('src' );
165
184
videoElement.load ();
166
185
}
0 commit comments