From d9c658566a14ce8767d87435264997aa18dd08e4 Mon Sep 17 00:00:00 2001 From: Alex Dvornikov Date: Thu, 14 Dec 2017 17:41:10 -0800 Subject: [PATCH] Fix a crash when keyboard is visible and bridge reload happens Reviewed By: sahrens Differential Revision: D6573855 fbshipit-source-id: 8768dca7d36782e82fb457f6ff4b09791e669d00 --- React/Modules/RCTEventEmitter.m | 5 +++-- React/Modules/RCTKeyboardObserver.m | 6 ++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/React/Modules/RCTEventEmitter.m b/React/Modules/RCTEventEmitter.m index 4c0e6d19c11e85..4550e2d57eae5e 100644 --- a/React/Modules/RCTEventEmitter.m +++ b/React/Modules/RCTEventEmitter.m @@ -37,9 +37,10 @@ + (void)initialize - (void)sendEventWithName:(NSString *)eventName body:(id)body { - RCTAssert(_bridge != nil, @"bridge is not set. This is probably because you've " + RCTAssert(_bridge != nil, @"Error when sending event: %@ with body: %@. " + "Bridge is not set. This is probably because you've " "explicitly synthesized the bridge in %@, even though it's inherited " - "from RCTEventEmitter.", [self class]); + "from RCTEventEmitter.", eventName, body, [self class]); if (RCT_DEBUG && ![[self supportedEvents] containsObject:eventName]) { RCTLogError(@"`%@` is not a supported event type for %@. Supported events are: `%@`", diff --git a/React/Modules/RCTKeyboardObserver.m b/React/Modules/RCTKeyboardObserver.m index 84804ca192accd..5909e09afacad6 100644 --- a/React/Modules/RCTKeyboardObserver.m +++ b/React/Modules/RCTKeyboardObserver.m @@ -54,9 +54,15 @@ - (void)stopObserving [[NSNotificationCenter defaultCenter] removeObserver:self]; } +// Bridge might be already invalidated by the time the keyboard is about to be dismissed. +// This might happen, for example, when reload from the packager is performed. +// Thus we need to check against nil here. #define IMPLEMENT_KEYBOARD_HANDLER(EVENT) \ - (void)EVENT:(NSNotification *)notification \ { \ + if (!self.bridge) { \ + return; \ + } \ [self sendEventWithName:@#EVENT \ body:RCTParseKeyboardNotification(notification)]; \ }