diff --git a/packages/pigeon/lib/dart_generator.dart b/packages/pigeon/lib/dart_generator.dart index e7ce4efcde84..881bde7dee6b 100644 --- a/packages/pigeon/lib/dart_generator.dart +++ b/packages/pigeon/lib/dart_generator.dart @@ -88,41 +88,50 @@ void _writeFlutterApi(Indent indent, Api api, 'BasicMessageChannel(\'$channelName\', StandardMessageCodec());'); indent.dec(); indent.dec(); - final String messageHandlerSetter = - isMockHandler ? 'setMockMessageHandler' : 'setMessageHandler'; - indent - .write('channel.$messageHandlerSetter((dynamic message) async '); - indent.scoped('{', '});', () { - final String argType = func.argType; - final String returnType = func.returnType; - final bool isAsync = func.isAsynchronous; - String call; - if (argType == 'void') { - call = 'api.${func.name}()'; - } else { - indent.writeln( - 'final Map mapMessage = message as Map;'); - indent.writeln( - 'final $argType input = $argType._fromMap(mapMessage);'); - call = 'api.${func.name}(input)'; - } - if (returnType == 'void') { - indent.writeln('$call;'); - if (isMockHandler) { - indent.writeln('return {};'); + indent.write('if (api != null) '); + indent.scoped('{', '}', () { + final String messageHandlerSetter = + isMockHandler ? 'setMockMessageHandler' : 'setMessageHandler'; + indent.write( + 'channel.$messageHandlerSetter((dynamic message) async '); + indent.scoped('{', '});', () { + final String argType = func.argType; + final String returnType = func.returnType; + final bool isAsync = func.isAsynchronous; + String call; + if (argType == 'void') { + call = 'api.${func.name}()'; + } else { + indent.writeln( + 'final Map mapMessage = message as Map;'); + indent.writeln( + 'final $argType input = $argType._fromMap(mapMessage);'); + call = 'api.${func.name}(input)'; } - } else { - if (isAsync) { - indent.writeln('final $returnType output = await $call;'); + if (returnType == 'void') { + indent.writeln('$call;'); + if (isMockHandler) { + indent.writeln('return {};'); + } } else { - indent.writeln('final $returnType output = $call;'); + if (isAsync) { + indent.writeln('final $returnType output = await $call;'); + } else { + indent.writeln('final $returnType output = $call;'); + } + const String returnExpresion = 'output._toMap()'; + final String returnStatement = isMockHandler + ? 'return {\'${Keys.result}\': $returnExpresion};' + : 'return $returnExpresion;'; + indent.writeln(returnStatement); } - const String returnExpresion = 'output._toMap()'; - final String returnStatement = isMockHandler - ? 'return {\'${Keys.result}\': $returnExpresion};' - : 'return $returnExpresion;'; - indent.writeln(returnStatement); - } + }); + }); + indent.write(' else '); + indent.scoped('{', '}', () { + final String messageHandlerSetter = + isMockHandler ? 'setMockMessageHandler' : 'setMessageHandler'; + indent.writeln('channel.$messageHandlerSetter(null);'); }); }); }