Flutter의 네이티브 플러그인 개발 방법
Flutter는 기본적으로 많은 기능을 제공하지만, 때로는 네이티브(Android, iOS) 기능을 직접 구현해야 할 경우가 있습니다. 이러한 기능을 다른 프로젝트에서도 재사용할 수 있도록 플러그인 형태로 개발할 수 있습니다.
이 글에서는 Flutter 네이티브 플러그인을 개발하는 방법을 살펴보고, Android(Java/Kotlin) 및 iOS(Swift)를 활용하여 직접 플러그인을 만드는 과정을 설명하겠습니다.
1. Flutter 네이티브 플러그인이란?
Flutter의 네이티브 플러그인은 Dart 코드와 네이티브(Android, iOS) 코드 사이에서 데이터를 주고받을 수 있도록 하는 모듈입니다.
Flutter 플러그인은 다음과 같은 경우에 필요합니다.
- 카메라, GPS, 블루투스 등 하드웨어 기능 사용
- Android 및 iOS에서 제공하는 네이티브 API 호출
- 백그라운드 서비스 실행
- 파일 시스템 및 네트워크 기능 확장
이제 Flutter에서 플러그인을 직접 개발하는 방법을 살펴보겠습니다.
2. Flutter 네이티브 플러그인 생성
(1) 플러그인 프로젝트 생성
Flutter 플러그인을 개발하려면 다음 명령어를 실행하여 새로운 플러그인 프로젝트를 생성합니다.
flutter create --template=plugin -a kotlin -i swift my_native_plugin
위 명령어는 Kotlin(Android) 및 Swift(iOS)로 구현된 플러그인 프로젝트를 생성합니다.
(2) 프로젝트 폴더 구조
생성된 플러그인 폴더 구조는 다음과 같습니다.
my_native_plugin/
├── android/ # Android 네이티브 코드 (Kotlin)
├── ios/ # iOS 네이티브 코드 (Swift)
├── lib/ # Flutter용 Dart 코드
├── example/ # 플러그인 테스트용 예제 프로젝트
├── pubspec.yaml # 플러그인 설정 파일
이제 Dart, Android, iOS에서 네이티브 기능을 구현해보겠습니다.
3. Dart 코드 작성
lib/my_native_plugin.dart
에서 MethodChannel
을 설정하여 네이티브 메서드를 호출합니다.
import 'package:flutter/services.dart';
class MyNativePlugin {
static const MethodChannel _channel = MethodChannel('my_native_plugin');
static Future getNativeMessage() async {
final String message = await _channel.invokeMethod('getMessage');
return message;
}
}
이제 getNativeMessage()
를 호출하면 네이티브(Android 또는 iOS)에서 메시지를 반환하게 됩니다.
4. Android 네이티브 코드 작성
Android에서 네이티브 기능을 구현하려면 android/src/main/kotlin/com/example/my_native_plugin/MyNativePlugin.kt
파일을 수정합니다.
package com.example.my_native_plugin
import androidx.annotation.NonNull
import io.flutter.embedding.engine.plugins.FlutterPlugin
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugin.common.MethodChannel.MethodCallHandler
import io.flutter.plugin.common.MethodChannel.Result
class MyNativePlugin: FlutterPlugin, MethodCallHandler {
private lateinit var channel: MethodChannel
override fun onAttachedToEngine(@NonNull flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
channel = MethodChannel(flutterPluginBinding.binaryMessenger, "my_native_plugin")
channel.setMethodCallHandler(this)
}
override fun onMethodCall(call: MethodCall, result: Result) {
if (call.method == "getMessage") {
result.success("안드로이드 네이티브 메시지")
} else {
result.notImplemented()
}
}
override fun onDetachedFromEngine(@NonNull binding: FlutterPlugin.FlutterPluginBinding) {
channel.setMethodCallHandler(null)
}
}
이제 Android에서 getMessage
를 호출하면 "안드로이드 네이티브 메시지"가 반환됩니다.
5. iOS 네이티브 코드 작성
iOS에서 네이티브 기능을 구현하려면 ios/Classes/MyNativePlugin.swift
파일을 수정합니다.
import Flutter
import UIKit
public class MyNativePlugin: NSObject, FlutterPlugin {
public static func register(with registrar: FlutterPluginRegistrar) {
let channel = FlutterMethodChannel(name: "my_native_plugin", binaryMessenger: registrar.messenger())
let instance = MyNativePlugin()
registrar.addMethodCallDelegate(instance, channel: channel)
}
public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
if call.method == "getMessage" {
result("iOS 네이티브 메시지")
} else {
result(FlutterMethodNotImplemented)
}
}
}
이제 iOS에서 getMessage
를 호출하면 "iOS 네이티브 메시지"가 반환됩니다.
6. 플러그인 테스트
플러그인 개발이 완료되면, example
폴더에서 플러그인을 테스트할 수 있습니다.
cd example
flutter run
이제 버튼을 클릭하면 Android에서는 "안드로이드 네이티브 메시지", iOS에서는 "iOS 네이티브 메시지"가 출력됩니다.
7. 플러그인 배포
완성된 플러그인을 pub.dev에 배포하려면 pubspec.yaml
을 설정한 후 아래 명령어를 실행합니다.
flutter pub publish
이제 다른 Flutter 프로젝트에서도 이 플러그인을 사용할 수 있습니다.
결론
Flutter에서 네이티브 플러그인을 개발하는 과정은 다음과 같습니다.
- Flutter에서 MethodChannel을 설정
- Android(Kotlin) 및 iOS(Swift)에서 네이티브 메서드 구현
- example 프로젝트에서 테스트
- 플러그인 배포
이제 Flutter에서 직접 네이티브 기능을 구현하고 플러그인을 개발하여 활용해 보세요!
'Flutter' 카테고리의 다른 글
Flutter의 플랫폼 채널(Platform Channel) 사용법 (1) | 2025.03.26 |
---|---|
Flutter의 네이티브 코드 호출 방법 (0) | 2025.03.25 |
Flutter의 플러그인 사용법 (0) | 2025.03.25 |
Flutter의 안드로이드 스타일 위젯(Material Widgets) 사용법 (0) | 2025.03.25 |
Flutter의 커스텀 플러그인 만들기 (0) | 2025.03.25 |