init method

  1. @override
Future<void> init({
  1. String? nativeAppKey,
  2. String? webAppKey,
})
override

Initialize KakaoMaps SDK

Implementation

@override
Future<void> init({String? nativeAppKey, String? webAppKey}) async {
  if (webAppKey == null || webAppKey.isEmpty) {
    throw ArgumentError.value(
      webAppKey,
      'webAppKey',
      'A Kakao JavaScript key is required on Web.',
    );
  }

  // Check if Kakao Maps SDK is already loaded (from HTML script tag)
  final kakaoObj = globalContext['kakao'] as JSObject?;

  if (kakaoObj != null) {
    // SDK script is loaded, now call kakao.maps.load()
    final mapsObj = kakaoObj['maps'] as JSObject?;
    if (mapsObj != null) {
      final loadFn = mapsObj['load'] as JSFunction?;
      if (loadFn != null) {
        final completer = Completer<void>();

        // Call kakao.maps.load(callback)
        loadFn.callAsFunction(
          mapsObj,
          (() {
            web.console.log('Kakao Maps SDK loaded successfully'.toJS);
            completer.complete();
          }).toJS,
        );

        return completer.future;
      }
    }
  }

  // Fallback: Dynamically load the SDK if not present in HTML
  web.console.log('Dynamically loading Kakao Maps SDK for web'.toJS);

  final completer = Completer<void>();

  final script =
      (web.document.createElement('script') as web.HTMLScriptElement)
        ..src =
            'https://dapi.kakao.com/v2/maps/sdk.js?appkey=$webAppKey&libraries=services,clusterer,drawing&autoload=false'
        ..async = true
        ..onLoad.listen((_) {
          // After script loads, call kakao.maps.load()
          final kakaoObj = globalContext['kakao'] as JSObject?;
          if (kakaoObj != null) {
            final mapsObj = kakaoObj['maps'] as JSObject?;
            if (mapsObj != null) {
              final loadFn = mapsObj['load'] as JSFunction?;
              if (loadFn != null) {
                loadFn.callAsFunction(
                  mapsObj,
                  (() {
                    web.console.log(
                      'Kakao Maps SDK loaded successfully (dynamic)'.toJS,
                    );
                    completer.complete();
                  }).toJS,
                );
                return;
              }
            }
          }
          completer.completeError(
            'Failed to initialize Kakao Maps after loading script',
          );
        })
        ..onError.listen((event) {
          completer.completeError('Failed to load Kakao Maps SDK for web.');
        });

  web.document.head?.append(script);

  return completer.future;
}