Flutter의 플랫폼 채널(Platform Channel) 사용법
Flutter는 네이티브(Android, iOS)와의 상호작용을 위해 플랫폼 채널(Platform Channel)을 제공합니다. 이를 활용하면 Android(Java/Kotlin) 및 iOS(Swift/Object-C)의 네이티브 API를 호출하여 Flutter에서 직접 사용할 수 있습니다.
이 글에서는 플랫폼 채널을 활용하여 Flutter에서 네이티브 기능을 호출하는 방법을 알아보겠습니다.
1. 플랫폼 채널(Platform Channel)이란?
플랫폼 채널은 Dart 코드와 네이티브(Android, iOS) 코드 간의 데이터를 주고받을 수 있도록 하는 통신 방법입니다.
플랫폼 채널은 다음과 같은 경우에 사용됩니다.
- 네이티브 기능(카메라, GPS, 센서 등) 활용
- Android 및 iOS의 시스템 API 호출
- 네이티브 UI와의 상호작용
Flutter의 플랫폼 채널은 MethodChannel
, EventChannel
, BasicMessageChannel
로 나뉩니다.
- MethodChannel: 단방향 네이티브 메서드 호출
- EventChannel: 네이티브에서 Flutter로 스트림(이벤트) 데이터 전송
- BasicMessageChannel: 바이너리 데이터 교환
이제 Flutter에서 MethodChannel
을 활용하여 네이티브 기능을 호출하는 방법을 살펴보겠습니다.
2. Flutter에서 네이티브 메서드 호출
Flutter에서 Android 및 iOS의 네이티브 기능을 호출하기 위해 MethodChannel
을 사용합니다.
(1) Flutter에서 플랫폼 채널 생성
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: PlatformChannelExample(),
);
}
}
class PlatformChannelExample extends StatefulWidget {
@override
_PlatformChannelExampleState createState() => _PlatformChannelExampleState();
}
class _PlatformChannelExampleState extends State {
static const platform = MethodChannel('com.example/native');
String _nativeMessage = '네이티브 메시지를 가져오는 중...';
Future getNativeMessage() async {
try {
final String result = await platform.invokeMethod('getMessage');
setState(() {
_nativeMessage = result;
});
} on PlatformException catch (e) {
setState(() {
_nativeMessage = "네이티브 호출 실패: ${e.message}";
});
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('플랫폼 채널 예제')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(_nativeMessage, style: TextStyle(fontSize: 18)),
SizedBox(height: 20),
ElevatedButton(
onPressed: getNativeMessage,
child: Text('네이티브 메시지 가져오기'),
),
],
),
),
);
}
}
위 코드는 MethodChannel
을 사용하여 getMessage
라는 네이티브 메서드를 호출합니다.
3. Android 네이티브 코드 작성
Android에서는 네이티브 코드를 작성하여 Flutter에서 요청한 메서드에 대한 응답을 반환합니다.
(1) Kotlin(Java도 가능)으로 네이티브 메서드 추가
android/app/src/main/kotlin/com/example/MainActivity.kt
파일을 수정합니다.
import android.os.Bundle
import io.flutter.embedding.android.FlutterActivity
import io.flutter.plugin.common.MethodChannel
class MainActivity: FlutterActivity() {
private val CHANNEL = "com.example/native"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
MethodChannel(flutterEngine!!.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
if (call.method == "getMessage") {
result.success("Android 네이티브 메시지")
} else {
result.notImplemented()
}
}
}
}
이제 Android에서는 getMessage
호출 시 "Android 네이티브 메시지"를 반환합니다.
4. iOS 네이티브 코드 작성
iOS에서는 Swift로 네이티브 메서드를 추가할 수 있습니다.
(1) Swift에서 네이티브 메서드 추가
ios/Runner/AppDelegate.swift
파일을 수정합니다.
import UIKit
import Flutter
@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
let controller = window?.rootViewController as! FlutterViewController
let channel = FlutterMethodChannel(name: "com.example/native", binaryMessenger: controller.binaryMessenger)
channel.setMethodCallHandler { (call, result) in
if call.method == "getMessage" {
result("iOS 네이티브 메시지")
} else {
result(FlutterMethodNotImplemented)
}
}
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
}
이제 iOS에서는 getMessage
호출 시 "iOS 네이티브 메시지"를 반환합니다.
5. 플랫폼 채널 테스트 및 실행
Flutter 앱을 실행하면 Android 및 iOS에서 각각 네이티브 메시지를 가져올 수 있습니다.
- Android 실행:
flutter run -d android
- iOS 실행:
flutter run -d ios
버튼을 클릭하면 현재 실행 중인 플랫폼(Android 또는 iOS)에 따라 다른 메시지가 출력됩니다.
결론
Flutter에서 플랫폼 채널을 사용하면 Android 및 iOS의 네이티브 기능을 호출할 수 있습니다. 주요 개념은 다음과 같습니다.
- MethodChannel: 단방향 네이티브 메서드 호출
- Android: Kotlin(Java)에서
MethodChannel
을 사용하여 메서드 구현 - iOS: Swift에서
FlutterMethodChannel
을 사용하여 메서드 구현
이제 Flutter에서 네이티브 기능을 활용하여 더욱 강력한 앱을 개발해 보세요!
'Flutter' 카테고리의 다른 글
Flutter의 iOS 스타일 위젯(Cupertino Widgets) 사용법 (0) | 2025.03.26 |
---|---|
Flutter의 플랫폼별 UI 차이점 (0) | 2025.03.26 |
Flutter의 네이티브 코드 호출 방법 (0) | 2025.03.25 |
Flutter의 네이티브 플러그인 개발 방법 (0) | 2025.03.25 |
Flutter의 플러그인 사용법 (0) | 2025.03.25 |