@senspond

>

개발>모바일

Flutter 네이티브 플러그인 만들고 외부 프로젝트에서 사용하기

등록일시 : 2024-08-15 (목) 12:21
업데이트 : 2024-08-16 (금) 12:03
오늘 조회수 : 7
총 조회수 : 475

    Flutter에서 MethodChannel은 Flutter 프레임워크와 네이티브 플랫폼(Android 또는 iOS) 간의 통신을 가능하게 하는 메커니즘입니다. 이 기능을 통해 Flutter 애플리케이션은 Dart 코드에서 Kotlin, Java, Swift 또는 Objective-C와 같은 네이티브 코드로 작성된 플랫폼별 기능을 호출할 수 있습니다.

    Flutter에서 MethodChannel은 Flutter 프레임워크와 네이티브 플랫폼(Android 또는 iOS) 간의 통신을 가능하게 하는 메커니즘입니다. 이 기능을 통해 Flutter 애플리케이션은 Dart 코드에서 Kotlin, Java, Swift 또는 Objective-C와 같은 네이티브 코드로 작성된 플랫폼별 기능을 호출할 수 있습니다.



    MethodChannel은 Flutter와 네이티브 코드 간의 양방향 통신을 지원하는 브리지 역할을 하며, Flutter 애플리케이션이 플랫폼의 고유 API를 호출하고 그 결과를 비동기적으로 받을 수 있도록 합니다. 이를 통해 Flutter에서 직접 제공하지 않는 네이티브 기능을 활용할 수 있게 되어, Flutter 애플리케이션의 기능을 확장할 수 있습니다.


    플러터 플러그인 프로젝트

    plugin 프로젝트 생성 방법

    ex) flutter create --template=plugin --org=com.rgbitcode.plugins --platforms=android,ios alarm_plugin


    —template=plugin : 플러그인 템플릿 사용

    —platforms : 어떤 플랫폼인지 (ios, android, linux, web, macos, windows)

    —org : organization

    -a : 안드로이드에서 어떤 언어를 사용할 것인지 (옵션을 줘서 기본 코틀린 대신 자바 가능 )

    -i : ios에서 어떤 언어를 사용할 것인지 (옵션을 줘서 기본 스위프트 대신 오브젝트C 가능)




    plugin 프로젝트 구조




    my_plugin/
    ├── example/
    │   └── lib/
    │       └── main.dart
    ├── lib/
    │   └── my_plugin.dart
    ├── android/
    │   ├── src/main/
    │   │   └── kotlin/com/example/my_plugin/MyPlugin.kt
    │   └── build.gradle
    ├── ios/
    │   ├── Classes/
    │   │   └── MyPlugin.m
    │   ├── MyPlugin.podspec
    │   └── Runner.xcworkspace
    ├── pubspec.yaml
    └── README.md

    lib/

    • my_plugin.dart: 플러그인의 핵심 Dart 코드가 들어가는 파일입니다. 이 파일에서는 플러그인의 API를 정의하고, MethodChannel 등을 사용하여 네이티브 코드와 통신합니다.

    android/

    • src/main/java/ 또는 src/main/kotlin/: 플러그인의 Android 네이티브 코드가 포함된 디렉토리입니다. 네이티브 기능을 구현하는 Java 또는 Kotlin 파일이 이 디렉토리에 위치합니다.

    ios/

    • Classes/: 플러그인의 iOS 네이티브 코드가 포함된 디렉토리입니다. Objective-C 또는 Swift로 구현된 네이티브 코드가 이 디렉토리에 위치합니다.

    example/

    • example/lib/main.dart: 플러그인을 테스트하기 위한 Flutter 애플리케이션입니다.

    pubspec.yaml

    • 플러그인의 메타데이터, 의존성, 버전 정보 등을 정의하는 파일입니다.


    일반 프로젝트는 Flutter 애플리케이션을 개발하는데 목적이 있다면,

    플러그인 프로젝트는 android, ios등 네이티브 코드를 플러터와 통합하여,

    외부 프로젝트에서 가져다가 쓸 수 있도록 만들기 위한 목적입니다.


    예제코드

    android/src/main/kotlin/… /AlarmPlugin.kt

    class AlarmPlugin: FlutterPlugin, MethodCallHandler {
      private lateinit var channel : MethodChannel
    
      override fun onAttachedToEngine(flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
        channel = MethodChannel(flutterPluginBinding.binaryMessenger, "com.rgbitcode.plugin.android.alarm")
        channel.setMethodCallHandler(this)
      }
    
      override fun onMethodCall(call: MethodCall, result: Result) {
        when(call.method){
          "setAlarm" -> result.success("알람을 설정했습니다")
        }
        result.notImplemented()
      }
    
      override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) {
        channel.setMethodCallHandler(null)
      }
    }

    채널 명에 organization 을 넣는 이유는, 타사 플러그인과 같이 사용했을 때 채널명이 중복 될 수 있기 때문입니다.

    네이티브 코드로 기능을 구현합니다.

    여기서는 간단하게 "알람을 설정했습니다" 라는 메시지를 돌려주는 코드를 작성했습니다.


    abstract class AlarmPluginPlatform extends PlatformInterface {
      AlarmPluginPlatform() : super(token: _token);
      static final Object _token = Object();
    
      static AlarmPluginPlatform _instance = MethodChannelAlarmPlugin();
      static AlarmPluginPlatform get instance => _instance;
      static set instance(AlarmPluginPlatform instance) {
        PlatformInterface.verifyToken(instance, _token);
        _instance = instance;
      }
    
      Future<String?> setAlarm() {
        throw UnimplementedError('setAlarm() has not been implemented.');
      }


    /lib/alarm_plugin_method_channel.dart

    class MethodChannelAlarmPlugin extends AlarmPluginPlatform {
    
      
      final methodChannel = const MethodChannel('com.rgbitcode.plugin.android.alarm');
    
      
      Future<String?> getPlatformVersion() async {
        final version = await methodChannel.invokeMethod<String>('setAlarm');
        return version;
      }
    }

    /lib/alarm_plugin.dart

    class AlarmPlugin {
      Future<String?> setAlarm() {
        return await methodChannel.invokeMethod<String>('setAlarm');
      }
    }


    AlarmPlugin 객체를 통해 Flutter에서 네이티브로 작성된 API를 호출할 수 있습니다.

    그런데 Android, iOS 동시에 지원되도록 만들어야 한다면?


    일단 코틀린과 swift로 각각의 네이티브 코드를 작성하고, 플러터의 MethodChannel를 각각 통신을 하게 만들어야 합니다. 그런데, 플러그인을 호출해서 사용하는 입장에서 IOS든 Android든 모두 동일한 메소드로 호출할 수 있도록 설계하는 것이 사용하기도 좋고 유지보수에도 용이 할 것입니다. 적절한 GoF 디자인 패턴을 사용해서 설계할 수 있겠습니다.


    플러터 일반 프로젝트에서 플러그인 사용



    ex) alarm_timer_stopwatch 라는 프로젝트에서 alarm_plugin 을 사용


    파일 경로에서

    dependencies:
      flutter:
        sdk: flutter
      alarm_plugin:
        path: [플러그인 디렉토리 경로]


    깃허브에서

    플러그인을 github에 올려두고 보다 간편하게 사용할 수 있다.

    dependencies:
      flutter:
        sdk: flutter
      alarm_plugin:
        git:
          url: https://github.com/username/alarm_plugin.git
          ref: main  




    이렇게 각 플랫폼별 네이티브 기능이 필요한 경우 별도의 플러그인으로 만들어서 사용할 수 있습니다.


    senspond

    안녕하세요. Red, Green, Blue 가 만나 새로운 세상을 만들어 나가겠다는 이상을 가진 개발자의 개인공간입니다.

    댓글 ( 0 )

    카테고리내 관련 게시글

    현재글에서 작성자가 발행한 같은 카테고리내 이전, 다음 글들을 보여줍니다

    @senspond

    >

    개발>모바일

    • flutter 에서 Hive Dart (NoSQL) 사용하기

      flutter 에서 Hive Dart (NoSQL) 사용하기
        2024-08-07 (수) 10:51
      1. Flutter에서 수학 수식 표기하는 방법, 어떤 오픈소스 라이브러리를 써야 할까?

        Flutter에서 수학 수식 표기하는 방법, 어떤 오픈소스 라이브러리를 써야 할까? 에 대해서 사용해 본 오픈소스 라이브러리들을 비교 분석해서 정리해본 글입니다.
          2024-08-28 (수) 03:50
        1. Flutter 의 위젯에 대한 개념과 StatefulWidget 생명주기, 컨트롤러, 빌더

          Flutter 의 위젯에 대한 개념과 StatefulWidget 생명주기, 컨트롤러, 빌더에 대해서 정리해 본 글입니다.
            2024-08-03 (토) 03:58
          1. 구글 플레이스토어 인앱결제 내부테스트 하는방법

            구글 플레이스토어 인앱결제 내부테스트 하는방법을 정리해봤습니다.
              2024-09-03 (화) 07:57
            1. [현재글] Flutter 네이티브 플러그인 만들고 외부 프로젝트에서 사용하기

              Flutter에서 MethodChannel은 Flutter 프레임워크와 네이티브 플랫폼(Android 또는 iOS) 간의 통신을 가능하게 하는 메커니즘입니다. 이 기능을 통해 Flutter 애플리케이션은 Dart 코드에서 Kotlin, Java, Swift 또는 Objective-C와 같은 네이티브 코드로 작성된 플랫폼별 기능을 호출할 수 있습니다.
                2024-08-15 (목) 12:21