Flutter의 커스텀 플러그인 만들기
Flutter는 강력한 크로스플랫폼 프레임워크이지만, 기본적으로 제공되지 않는 네이티브 기능이 필요할 경우 커스텀 플러그인을 직접 개발할 수 있습니다. 플러그인을 만들면 Flutter 프로젝트에서 여러 번 재사용할 수 있으며, pub.dev에 배포하여 다른 개발자와 공유할 수도 있습니다.
이 글에서는 Flutter 커스텀 플러그인을 생성하고, Android(Java/Kotlin) 및 iOS(Swift)를 활용하여 구현하는 방법을 단계별로 설명하겠습니다.
1. Flutter 커스텀 플러그인이란?
Flutter 플러그인은 Flutter 앱과 네이티브(Android, iOS) 코드 간의 통신을 가능하게 하는 모듈입니다. 네이티브 기능을 Flutter에서 호출할 수 있도록 MethodChannel
을 사용하여 구현됩니다.
커스텀 플러그인은 다음과 같은 기능을 추가하는 데 유용합니다.
- 네이티브 API(Android & iOS) 호출
- 센서, GPS, 블루투스 등의 하드웨어 접근
- 파일 시스템 및 네트워크 관련 작업
- 네이티브 UI와 상호작용
이제 Flutter에서 직접 플러그인을 만드는 방법을 살펴보겠습니다.
2. Flutter 커스텀 플러그인 생성
Flutter에서 플러그인을 생성하려면 다음 명령어를 실행합니다.
flutter create --template=plugin -a kotlin -i swift my_custom_plugin
이 명령어는 my_custom_plugin
이라는 이름의 플러그인을 생성하며, Android는 Kotlin, iOS는 Swift를 기본 언어로 사용합니다.
(1) 플러그인 프로젝트 폴더 구조
my_custom_plugin/
├── android/ # Android 네이티브 코드 (Kotlin)
├── ios/ # iOS 네이티브 코드 (Swift)
├── lib/ # Dart 코드
├── example/ # 플러그인 테스트용 예제 프로젝트
├── pubspec.yaml # 플러그인 설정 파일
3. Dart 코드 작성
먼저, Flutter에서 네이티브 메서드를 호출할 수 있도록 MethodChannel
을 설정합니다. lib/my_custom_plugin.dart
파일을 수정합니다.
import 'package:flutter/services.dart';
class MyCustomPlugin {
static const MethodChannel _channel = MethodChannel('my_custom_plugin');
static Future getNativeMessage() async {
final String message = await _channel.invokeMethod('getMessage');
return message;
}
}
이제 Flutter에서 getNativeMessage()
를 호출하면 네이티브(Android 또는 iOS)에서 데이터를 받아올 수 있습니다.
4. Android 네이티브 코드 작성
Android에서 네이티브 기능을 구현하려면 android/src/main/kotlin/com/example/my_custom_plugin/MyCustomPlugin.kt
파일을 수정합니다.
package com.example.my_custom_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 MyCustomPlugin: FlutterPlugin, MethodCallHandler {
private lateinit var channel: MethodChannel
override fun onAttachedToEngine(@NonNull flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
channel = MethodChannel(flutterPluginBinding.binaryMessenger, "my_custom_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/MyCustomPlugin.swift
파일을 수정합니다.
import Flutter
import UIKit
public class MyCustomPlugin: NSObject, FlutterPlugin {
public static func register(with registrar: FlutterPluginRegistrar) {
let channel = FlutterMethodChannel(name: "my_custom_plugin", binaryMessenger: registrar.messenger())
let instance = MyCustomPlugin()
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의 플러그인 사용법 (0) | 2025.03.25 |
---|---|
Flutter의 안드로이드 스타일 위젯(Material Widgets) 사용법 (0) | 2025.03.25 |
Flutter의 플랫폼 위젯 사용법 (0) | 2025.03.25 |
Flutter의 플랫폼별 기능 지원 방법 (0) | 2025.03.24 |
Flutter의 모바일 디바이스 최적화 방법 (0) | 2025.03.24 |