initChannelFunctions method

  1. @override
void initChannelFunctions()
override

Implementation

@override
void initChannelFunctions() {
  JavascriptRuntime.channelFunctionsRegistered[getEngineInstanceId()] = {};
  final setup = evaluate("(key, val) => { this[key] = val; }");
  if (setup.isError || setup.rawResult is! JSInvokable) {
    throw JSError(
      'initChannelFunctions: bridge setup evaluate failed: '
      '${setup.stringResult}',
    );
  }
  final setToGlobalObject = setup.rawResult as JSInvokable;
  try {
    setToGlobalObject.invoke([
      'sendMessage',
      (String channelName, dynamic message) {
        final channelFunctions = JavascriptRuntime
            .channelFunctionsRegistered[getEngineInstanceId()];

        if (channelFunctions == null ||
            !channelFunctions.containsKey(channelName)) {
          FlutterQjsLogger.warning('No channel $channelName registered');
          return null;
        }

        dynamic payload = message;
        if (message is String) {
          try {
            payload = jsonDecode(message);
          } catch (_) {
            payload = message;
          }
        }
        return channelFunctions[channelName]!.call(payload);
      },
    ]);
  } finally {
    setToGlobalObject.free();
  }
}