[camera]revert the weakSelf in FLTThreadSafeEventChannel (#6303)
diff --git a/packages/camera/camera_avfoundation/CHANGELOG.md b/packages/camera/camera_avfoundation/CHANGELOG.md index 4df497b..897a175 100644 --- a/packages/camera/camera_avfoundation/CHANGELOG.md +++ b/packages/camera/camera_avfoundation/CHANGELOG.md
@@ -1,3 +1,7 @@ +## 0.9.8+5 + +* Fixes a regression introduced in 0.9.8+4 where the stream handler is not set. + ## 0.9.8+4 * Fixes a crash due to sending orientation change events when the engine is torn down.
diff --git a/packages/camera/camera_avfoundation/example/ios/RunnerTests/ThreadSafeEventChannelTests.m b/packages/camera/camera_avfoundation/example/ios/RunnerTests/ThreadSafeEventChannelTests.m index e7460de..2aad7e3 100644 --- a/packages/camera/camera_avfoundation/example/ios/RunnerTests/ThreadSafeEventChannelTests.m +++ b/packages/camera/camera_avfoundation/example/ios/RunnerTests/ThreadSafeEventChannelTests.m
@@ -63,4 +63,20 @@ [self waitForExpectationsWithTimeout:1 handler:nil]; } +- (void)testEventChannel_shouldBeKeptAliveWhenDispatchingBackToMainThread { + XCTestExpectation *expectation = + [self expectationWithDescription:@"Completion should be called."]; + dispatch_async(dispatch_queue_create("test", NULL), ^{ + FLTThreadSafeEventChannel *channel = [[FLTThreadSafeEventChannel alloc] + initWithEventChannel:OCMClassMock([FlutterEventChannel class])]; + + [channel setStreamHandler:OCMOCK_ANY + completion:^{ + [expectation fulfill]; + }]; + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + @end
diff --git a/packages/camera/camera_avfoundation/ios/Classes/FLTThreadSafeEventChannel.m b/packages/camera/camera_avfoundation/ios/Classes/FLTThreadSafeEventChannel.m index ed749a3..57d154c 100644 --- a/packages/camera/camera_avfoundation/ios/Classes/FLTThreadSafeEventChannel.m +++ b/packages/camera/camera_avfoundation/ios/Classes/FLTThreadSafeEventChannel.m
@@ -21,11 +21,13 @@ - (void)setStreamHandler:(NSObject<FlutterStreamHandler> *)handler completion:(void (^)(void))completion { - __weak typeof(self) weakSelf = self; + // WARNING: Should not use weak self, because FLTThreadSafeEventChannel is a local variable + // (retained within call stack, but not in the heap). FLTEnsureToRunOnMainQueue may trigger a + // context switch (when calling from background thread), in which case using weak self will always + // result in a nil self. Alternative to using strong self, we can also create a local strong + // variable to be captured by this block. FLTEnsureToRunOnMainQueue(^{ - typeof(self) strongSelf = weakSelf; - if (!strongSelf) return; - [strongSelf.channel setStreamHandler:handler]; + [self.channel setStreamHandler:handler]; completion(); }); }
diff --git a/packages/camera/camera_avfoundation/pubspec.yaml b/packages/camera/camera_avfoundation/pubspec.yaml index 3d1b7c6..c25fe66 100644 --- a/packages/camera/camera_avfoundation/pubspec.yaml +++ b/packages/camera/camera_avfoundation/pubspec.yaml
@@ -2,7 +2,7 @@ description: iOS implementation of the camera plugin. repository: https://github.com/flutter/plugins/tree/main/packages/camera/camera_avfoundation issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 -version: 0.9.8+4 +version: 0.9.8+5 environment: sdk: ">=2.14.0 <3.0.0"