728x90
반응형
Flutter는 강력한 UI 프레임워크지만, 때로는 네이티브(Android 또는 iOS)의 기능이 꼭 필요할 때가 있다.
예를 들어 배터리 잔량을 가져오거나, 기기의 고유 센서를 사용해야 하는 경우 말이다.
이럴 때 등장하는 게 바로 Platform Channel이다.
이 글에서는 Flutter에서 네이티브 기능을 호출하는 구조인 Platform Channel을
Android (Kotlin)과 iOS (Swift) 기준으로 차근차근 설명해 보겠다.
📦 Platform Channel 구조 이해하기
Platform Channel은 Flutter ↔ Native 간의 통신을 위해 사용되며, 세 가지 주요 타입이 있다:
- MethodChannel: 단방향 또는 요청-응답 방식
- EventChannel: 스트림 방식 (ex. 센서값)
- BasicMessageChannel: 양방향 메시지 교환
대부분의 경우 MethodChannel만으로 충분하다.
💻 Android 예제: 배터리 잔량 가져오기
1. Flutter 코드 작성
import 'package:flutter/services.dart';
class BatteryService {
static const platform = MethodChannel('com.example/battery');
Future<int> getBatteryLevel() async {
try {
final int result = await platform.invokeMethod('getBatteryLevel');
return result;
} catch (e) {
return -1;
}
}
}
2. Android (Kotlin)
Android 프로젝트 > MainActivity.kt 에 다음 코드 추가:
class MainActivity: FlutterActivity() {
private val CHANNEL = "com.example/battery"
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL)
.setMethodCallHandler { call, result ->
if (call.method == "getBatteryLevel") {
val batteryLevel = getBatteryLevel()
if (batteryLevel != -1) {
result.success(batteryLevel)
} else {
result.error("UNAVAILABLE", "Battery level not available.", null)
}
} else {
result.notImplemented()
}
}
}
private fun getBatteryLevel(): Int {
val batteryManager = getSystemService(BATTERY_SERVICE) as BatteryManager
return batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY)
}
}
📱 iOS 예제: 배터리 잔량 가져오기 (Swift)
iOS에서는 AppDelegate.swift
에 아래와 같이 추가한다:
import Flutter
import UIKit
@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
let controller = window?.rootViewController as! FlutterViewController
let batteryChannel = FlutterMethodChannel(name: "com.example/battery",
binaryMessenger: controller.binaryMessenger)
batteryChannel.setMethodCallHandler { (call, result) in
if call.method == "getBatteryLevel" {
UIDevice.current.isBatteryMonitoringEnabled = true
let level = UIDevice.current.batteryLevel
if level == -1.0 {
result(FlutterError(code: "UNAVAILABLE", message: "Battery info unavailable", details: nil))
} else {
result(Int(level * 100))
}
} else {
result(FlutterMethodNotImplemented)
}
}
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
}
🚀 Platform Channel 사용 시 주의할 점
- 플랫폼마다 API가 다르기 때문에 예외 처리를 철저히!
- 채널 이름은 양쪽(Android, iOS)에서 동일하게 맞춰야 한다
- 성능 이슈를 고려해 자주 호출되는 함수는 피하자
🧘 마무리하며
Platform Channel은 Flutter의 한계를 뛰어넘게 해주는 강력한 무기다.
하지만 동시에 네이티브에 대한 이해를 요구하기도 한다.
Flutter와 네이티브는 서로 다른 세계지만,
우리가 그 사이를 연결하는 순간, 그 앱은 더 이상 '하이브리드'가 아니다.
진짜 앱이 된다.
✍️ 이 글은 터미널 밖으로 나온 개발자의 Flutter 심화과정입니다.
728x90
반응형
'Flutter' 카테고리의 다른 글
Flutter에서 Custom Widget 제대로 만들기 — 재사용 가능한 컴포넌트 설계 (0) | 2025.05.23 |
---|---|
상태 관리 마스터하기 — Provider, Riverpod, Bloc 비교와 선택 가이드 (0) | 2025.05.23 |
CustomPainter 완전 정복 — Flutter에서 나만의 캔버스를 그려보자 (0) | 2025.05.22 |
Flutter에서 HTTP로 서버 데이터 불러오기 — 작은 연결이 만들어내는 큰 변화 (0) | 2025.05.19 |
Flutter 애니메이션 & 전환 효과 완전 정복 — 감성을 더한 부드러운 움직임 만들기 (0) | 2025.05.16 |