提交 4dc3c056 编写于 作者: A Adam Barth

FlutterViewController should not retain listeners (#2726)

This patch makes the FlutterViewController interface more idiomatic by not
retaining listeners. It's the callers responsibility to make sure the lifetimes
work out.
上级 31f554b7
...@@ -15,6 +15,8 @@ FLUTTER_EXPORT ...@@ -15,6 +15,8 @@ FLUTTER_EXPORT
- (void)didReceiveString:(NSString*)message - (void)didReceiveString:(NSString*)message
callback:(void(^)(NSString*))sendResponse; callback:(void(^)(NSString*))sendResponse;
@property(readonly, strong, nonatomic) NSString* messageName;
@end @end
#endif // FLUTTER_FLUTTERASYNCMESSAGELISTENER_H_ #endif // FLUTTER_FLUTTERASYNCMESSAGELISTENER_H_
...@@ -14,6 +14,8 @@ FLUTTER_EXPORT ...@@ -14,6 +14,8 @@ FLUTTER_EXPORT
- (NSString*)didReceiveString:(NSString*)message; - (NSString*)didReceiveString:(NSString*)message;
@property(readonly, strong, nonatomic) NSString* messageName;
@end @end
#endif // FLUTTER_FLUTTERMESSAGELISTENER_H_ #endif // FLUTTER_FLUTTERMESSAGELISTENER_H_
...@@ -28,11 +28,13 @@ FLUTTER_EXPORT ...@@ -28,11 +28,13 @@ FLUTTER_EXPORT
withMessageName:(NSString*)messageName withMessageName:(NSString*)messageName
callback:(void(^)(NSString*))callback; callback:(void(^)(NSString*))callback;
- (void)setMessageListener:(NSObject<FlutterMessageListener>*)listener - (void)addMessageListener:(NSObject<FlutterMessageListener>*)listener;
forMessagesWithName:(NSString*)messageName;
- (void)setAsyncMessageListener:(NSObject<FlutterAsyncMessageListener>*)listener - (void)removeMessageListener:(NSObject<FlutterMessageListener>*)listener;
forMessagesWithName:(NSString*)messageName;
- (void)addAsyncMessageListener:(NSObject<FlutterAsyncMessageListener>*)listener;
- (void)removeAsyncMessageListener:(NSObject<FlutterAsyncMessageListener>*)listener;
@end @end
......
...@@ -483,20 +483,32 @@ static inline PointerTypeMapperPhase PointerTypePhaseFromUITouchPhase( ...@@ -483,20 +483,32 @@ static inline PointerTypeMapperPhase PointerTypePhaseFromUITouchPhase(
}); });
} }
- (void)setMessageListener:(NSObject<FlutterMessageListener>*)listener - (void)addMessageListener:(NSObject<FlutterMessageListener>*)listener {
forMessagesWithName:(NSString*)messageName {
NSAssert(listener, @"The listener must not be null"); NSAssert(listener, @"The listener must not be null");
NSString* messageName = listener.messageName;
NSAssert(messageName, @"The messageName must not be null"); NSAssert(messageName, @"The messageName must not be null");
_appMessageReceiver.SetMessageListener(messageName.UTF8String, _appMessageReceiver.SetMessageListener(messageName.UTF8String, listener);
base::scoped_nsprotocol<NSObject<FlutterMessageListener>*>(listener));
} }
- (void)setAsyncMessageListener:(NSObject<FlutterAsyncMessageListener>*)listener - (void)removeMessageListener:(NSObject<FlutterMessageListener>*)listener {
forMessagesWithName:(NSString*)messageName {
NSAssert(listener, @"The listener must not be null"); NSAssert(listener, @"The listener must not be null");
NSString* messageName = listener.messageName;
NSAssert(messageName, @"The messageName must not be null"); NSAssert(messageName, @"The messageName must not be null");
_appMessageReceiver.SetAsyncMessageListener(messageName.UTF8String, _appMessageReceiver.SetMessageListener(messageName.UTF8String, nil);
base::scoped_nsprotocol<NSObject<FlutterAsyncMessageListener>*>(listener)); }
- (void)addAsyncMessageListener:(NSObject<FlutterAsyncMessageListener>*)listener {
NSAssert(listener, @"The listener must not be null");
NSString* messageName = listener.messageName;
NSAssert(messageName, @"The messageName must not be null");
_appMessageReceiver.SetAsyncMessageListener(messageName.UTF8String, listener);
}
- (void)removeAsyncMessageListener:(NSObject<FlutterAsyncMessageListener>*)listener {
NSAssert(listener, @"The listener must not be null");
NSString* messageName = listener.messageName;
NSAssert(messageName, @"The messageName must not be null");
_appMessageReceiver.SetAsyncMessageListener(messageName.UTF8String, nil);
} }
@end @end
...@@ -8,7 +8,6 @@ ...@@ -8,7 +8,6 @@
#include <unordered_map> #include <unordered_map>
#include "base/memory/weak_ptr.h" #include "base/memory/weak_ptr.h"
#include "base/mac/scoped_nsobject.h"
#include "mojo/common/binding_set.h" #include "mojo/common/binding_set.h"
#include "sky/services/platform/app_messages.mojom.h" #include "sky/services/platform/app_messages.mojom.h"
#include "sky/shell/platform/ios/framework/Headers/FlutterAsyncMessageListener.h" #include "sky/shell/platform/ios/framework/Headers/FlutterAsyncMessageListener.h"
...@@ -27,11 +26,11 @@ class ApplicationMessagesImpl : public flutter::platform::ApplicationMessages { ...@@ -27,11 +26,11 @@ class ApplicationMessagesImpl : public flutter::platform::ApplicationMessages {
void SetMessageListener( void SetMessageListener(
const std::string& message_name, const std::string& message_name,
base::scoped_nsprotocol<NSObject<FlutterMessageListener>*> listener); NSObject<FlutterMessageListener>* listener);
void SetAsyncMessageListener( void SetAsyncMessageListener(
const std::string& message_name, const std::string& message_name,
base::scoped_nsprotocol<NSObject<FlutterAsyncMessageListener>*> listener); NSObject<FlutterAsyncMessageListener>* listener);
private: private:
void SendString(const mojo::String& message_name, void SendString(const mojo::String& message_name,
...@@ -40,11 +39,9 @@ class ApplicationMessagesImpl : public flutter::platform::ApplicationMessages { ...@@ -40,11 +39,9 @@ class ApplicationMessagesImpl : public flutter::platform::ApplicationMessages {
mojo::BindingSet<flutter::platform::ApplicationMessages> binding_; mojo::BindingSet<flutter::platform::ApplicationMessages> binding_;
std::unordered_map< std::unordered_map<
std::string, std::string, NSObject<FlutterMessageListener>*> listeners_;
base::scoped_nsprotocol<NSObject<FlutterMessageListener>*>> listeners_;
std::unordered_map< std::unordered_map<
std::string, std::string, NSObject<FlutterAsyncMessageListener>*> async_listeners_;
base::scoped_nsprotocol<NSObject<FlutterAsyncMessageListener>*>> async_listeners_;
base::WeakPtrFactory<ApplicationMessagesImpl> weak_factory_; base::WeakPtrFactory<ApplicationMessagesImpl> weak_factory_;
}; };
......
...@@ -26,14 +26,20 @@ void ApplicationMessagesImpl::AddBinding( ...@@ -26,14 +26,20 @@ void ApplicationMessagesImpl::AddBinding(
void ApplicationMessagesImpl::SetMessageListener( void ApplicationMessagesImpl::SetMessageListener(
const std::string& message_name, const std::string& message_name,
base::scoped_nsprotocol<NSObject<FlutterMessageListener>*> listener) { NSObject<FlutterMessageListener>* listener) {
if (listener)
listeners_[message_name] = listener; listeners_[message_name] = listener;
else
listeners_.erase(message_name);
} }
void ApplicationMessagesImpl::SetAsyncMessageListener( void ApplicationMessagesImpl::SetAsyncMessageListener(
const std::string& message_name, const std::string& message_name,
base::scoped_nsprotocol<NSObject<FlutterAsyncMessageListener>*> listener) { NSObject<FlutterAsyncMessageListener>* listener) {
if (listener)
async_listeners_[message_name] = listener; async_listeners_[message_name] = listener;
else
async_listeners_.erase(message_name);
} }
void ApplicationMessagesImpl::SendString( void ApplicationMessagesImpl::SendString(
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册