Flutter 앱에서 네이티브 모듈 연동 시 발생한 MethodChannel 이슈
문제 상황
회사에서 진행 중인 Flutter 프로젝트에 기존 Android 네이티브 블루투스 모듈을 연동해야 했다. MethodChannel을 사용해 Flutter와 네이티브 코드 간 통신을 구현했는데, 간헐적으로 메서드 호출이 응답 없이 멈추는 현상이 발생했다.
static const platform = MethodChannel('com.example.bluetooth');
try {
final result = await platform.invokeMethod('scanDevices');
// 여기서 멈춤
} catch (e) {
print('Error: $e');
}
원인 분석
네이티브 코드를 확인해보니, 블루투스 스캔이 백그라운드 스레드에서 실행되고 있었다. MethodChannel의 result 콜백을 백그라운드 스레드에서 호출하면서 문제가 발생했다.
override fun onMethodCall(call: MethodCall, result: Result) {
when (call.method) {
"scanDevices" -> {
bluetoothScanner.scan { devices ->
// 이 콜백이 백그라운드 스레드에서 실행됨
result.success(devices) // 문제 발생 지점
}
}
}
}
해결 방법
MethodChannel의 result는 반드시 메인 스레드(UI 스레드)에서 호출해야 한다. Handler를 사용해 메인 스레드로 전환했다.
private val mainHandler = Handler(Looper.getMainLooper())
override fun onMethodCall(call: MethodCall, result: Result) {
when (call.method) {
"scanDevices" -> {
bluetoothScanner.scan { devices ->
mainHandler.post {
result.success(devices)
}
}
}
}
}
결론
Flutter의 MethodChannel은 플랫폼별 스레드 모델을 잘 이해하고 사용해야 한다. 특히 비동기 작업이 많은 네이티브 모듈을 연동할 때는 스레드 전환에 주의가 필요하다. 공식 문서에는 명확히 나와있지만 실제 개발 시 놓치기 쉬운 부분이었다.