[video_player] Made the video_player clean up after itself on iOS. (#2528)
diff --git a/packages/video_player/video_player/CHANGELOG.md b/packages/video_player/video_player/CHANGELOG.md index bff37f5..c74aa31 100644 --- a/packages/video_player/video_player/CHANGELOG.md +++ b/packages/video_player/video_player/CHANGELOG.md
@@ -1,3 +1,8 @@ +## 0.10.8 + +* Added support for cleaning up the plugin if used for add-to-app (Flutter + v1.15.3 is required for that feature). + ## 0.10.7 * `VideoPlayerController` support for reading closed caption files.
diff --git a/packages/video_player/video_player/ios/Classes/FLTVideoPlayerPlugin.m b/packages/video_player/video_player/ios/Classes/FLTVideoPlayerPlugin.m index 0d3a29e..39313fa 100644 --- a/packages/video_player/video_player/ios/Classes/FLTVideoPlayerPlugin.m +++ b/packages/video_player/video_player/ios/Classes/FLTVideoPlayerPlugin.m
@@ -6,6 +6,10 @@ #import <AVFoundation/AVFoundation.h> #import <GLKit/GLKit.h> +#if !__has_feature(objc_arc) +#error Code Requires ARC. +#endif + int64_t FLTCMTimeToMillis(CMTime time) { if (time.timescale == 0) return 0; return time.value * 1000 / time.timescale; @@ -13,7 +17,7 @@ @interface FLTFrameUpdater : NSObject @property(nonatomic) int64_t textureId; -@property(nonatomic, readonly) NSObject<FlutterTextureRegistry>* registry; +@property(nonatomic, weak, readonly) NSObject<FlutterTextureRegistry>* registry; - (void)onDisplayLink:(CADisplayLink*)link; @end @@ -386,7 +390,10 @@ return nil; } -- (void)dispose { +/// This method allows you to dispose without touching the event channel. This +/// is useful for the case where the Engine is in the process of deconstruction +/// so the channel is going to die or is already dead. +- (void)disposeSansEventChannel { _disposed = true; [_displayLink invalidate]; [[_player currentItem] removeObserver:self forKeyPath:@"status" context:statusContext]; @@ -404,17 +411,20 @@ context:playbackBufferFullContext]; [_player replaceCurrentItemWithPlayerItem:nil]; [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + +- (void)dispose { + [self disposeSansEventChannel]; [_eventChannel setStreamHandler:nil]; } @end @interface FLTVideoPlayerPlugin () -@property(readonly, nonatomic) NSObject<FlutterTextureRegistry>* registry; -@property(readonly, nonatomic) NSObject<FlutterBinaryMessenger>* messenger; -@property(readonly, nonatomic) NSMutableDictionary* players; -@property(readonly, nonatomic) NSObject<FlutterPluginRegistrar>* registrar; - +@property(readonly, weak, nonatomic) NSObject<FlutterTextureRegistry>* registry; +@property(readonly, weak, nonatomic) NSObject<FlutterBinaryMessenger>* messenger; +@property(readonly, strong, nonatomic) NSMutableDictionary* players; +@property(readonly, strong, nonatomic) NSObject<FlutterPluginRegistrar>* registrar; @end @implementation FLTVideoPlayerPlugin @@ -424,6 +434,7 @@ binaryMessenger:[registrar messenger]]; FLTVideoPlayerPlugin* instance = [[FLTVideoPlayerPlugin alloc] initWithRegistrar:registrar]; [registrar addMethodCallDelegate:instance channel:channel]; + [registrar publish:instance]; } - (instancetype)initWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar { @@ -436,6 +447,14 @@ return self; } +- (void)detachFromEngineForRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar { + for (NSNumber* textureId in _players.allKeys) { + FLTVideoPlayer* player = _players[textureId]; + [player disposeSansEventChannel]; + } + [_players removeAllObjects]; +} + - (void)onPlayerSetup:(FLTVideoPlayer*)player frameUpdater:(FLTFrameUpdater*)frameUpdater result:(FlutterResult)result { @@ -485,7 +504,6 @@ } else { result(FlutterMethodNotImplemented); } - } else { NSDictionary* argsMap = call.arguments; int64_t textureId = ((NSNumber*)argsMap[@"textureId"]).unsignedIntegerValue;
diff --git a/packages/video_player/video_player/pubspec.yaml b/packages/video_player/video_player/pubspec.yaml index 43a69a5..417d21f 100644 --- a/packages/video_player/video_player/pubspec.yaml +++ b/packages/video_player/video_player/pubspec.yaml
@@ -1,7 +1,7 @@ name: video_player description: Flutter plugin for displaying inline video with other Flutter widgets on Android and iOS. -version: 0.10.7 +version: 0.10.8 homepage: https://github.com/flutter/plugins/tree/master/packages/video_player/video_player flutter: