Flutter와 네이티브의 연결고리 — Platform Channel 실전 입문

2025. 5. 22. 17:25·Flutter
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
'Flutter' 카테고리의 다른 글
  • Flutter에서 Custom Widget 제대로 만들기 — 재사용 가능한 컴포넌트 설계
  • 상태 관리 마스터하기 — Provider, Riverpod, Bloc 비교와 선택 가이드
  • CustomPainter 완전 정복 — Flutter에서 나만의 캔버스를 그려보자
  • Flutter에서 HTTP로 서버 데이터 불러오기 — 작은 연결이 만들어내는 큰 변화
코드를 걷는 사람
코드를 걷는 사람
devwanderer 님의 블로그 입니다.
  • 코드를 걷는 사람
    터미널 밖으로 나온 개발자
    코드를 걷는 사람
  • 전체
    오늘
    어제
    • 분류 전체보기
      • Flutter
        • Flutter 게시판 앱 만들기
        • Flutter 뉴스 앱 만들기
        • Flutter 메모 앱 만들기
        • Flutter 캘린더 앱 만들기
        • Flutter 날씨 앱 만들기
      • Next.js
      • Ruby On Rails
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Flutter
    코드를걷는사람
    개발블로그
    flutter기초
    flutter디자인
    모바일앱개발
    Firebase
    flutter상태관리
    UI디자인
    Nextjs
    openweather
    flutter앱개발
    백엔드개발
    다크모드
    flutter게시판
    북마크기능
    캘린더앱
    fluttertips
    날씨앱
    rails보안
    ActiveRecord
    감성앱
    정적사이트
    table_calendar
    뉴스앱
    UIUX
    flutter개발
    flutterui
    메모앱
    RubyOnRails
  • 최근 댓글

  • 최근 글

  • 반응형
    250x250
  • hELLO· Designed By정상우.v4.10.3
코드를 걷는 사람
Flutter와 네이티브의 연결고리 — Platform Channel 실전 입문
상단으로

티스토리툴바