파파비의 블로그

플랫폼과 대화하는 방법 Method Channel / Event Channel 본문

개발/flutter

플랫폼과 대화하는 방법 Method Channel / Event Channel

N. Dave 2020. 7. 31. 09:36
반응형

플러터는 ios나 안드로이드에서 구동되는데, 이때 이렇게 host와 대화하는 할 때 사용하는 통로를

Platform Channel 이라고 한다.

 

여기에는 2개가 있다. 

1. Method Channel

2. Event Channel

 

이둘은 os의 정보를 플러터에게 제공한다는 점에서는 같지만,

Event Channel은 stream의 성격을 가지고 있고,

Method Channel은 단발적이라고 보면 된다.

 

여기서는 Method Channel에 대해 심도있게 다뤄보려고 하는데,

먼저 Output부터 보고 얘기하자.

- 이 플러터 앱은 os의 빌드버젼을 확인할 수 있다. 

- 따로 어떤 플러그인을 쓴 것이 아니다.

 

os버전은 기기 마다 다르기 때문에 직접 os에 가서 확인해야 한다.

어떻게 한 것일까? Method Channel을 이용한 것이다.

 

플러터와 각 host(ios, 안드로이드)는 소통을 해야하기 때문에,

플러터쪽에서 코드를 적고, 각 host 쪽에서도 코드를 적어주어야 한다.

그래서 플러터에서 요청을 보내면 host쪽에서도 그 요청을 해석하고

그에 따른 대응을 할 수 있도록 우리가 코드를 짜야한다.

플러터 코드를 통해 host쪽에서 코드가 실행되도록하는 그 연결을 Method Channel이 하게 된다.

 

코드를 살펴보도록하자.

platform이라는 static한 MethodChannel 객체를 만들었다.

이 객체에 들어가는 이름은 고유해야한다.

MethodChannel은 여러 개가 만들어질 수 있고, 그래서 고유한 이름을 통해 플랫폼과 플러터가 서로 정확한 채널을 확인한다. 

 

아래는 os버전을 확인하는 버튼에 대한 dart 코드이다.

코드를 살펴보면 _getOSVersion()이라는 메소드가 실행되도록 한 것을 알 수 있다.

_getOSVersion() 메소드를 자세히 살펴보자.

 

_getOSVersion() 의 코드이다.

아까 만든 메소드채널 객체를 통해, invokeMethod를 실행하고 있고, 그 안에는 'getOSVersion' 이라고 적혀있다.

 

이것은 무슨의미일까? 

해석해보면, MethodChannel을 통해 host한테가서, host한테 있는 getOSVersion 메소드을 실행해줘! 라는 뜻이다.

그리고 그것에 return값을 version이라는 String에 넣는 것이다.

아무래도 host에서 진행하다 보니 try/error문으로 혹시 모를 에러에 대비한 모습이다.

(getOSVersion 이라는 메소드가 없을 수도 있고...)

 

MethodChannel를 간단히 정리하면, os에 있는 메소드를 실행해서 결과값을 가져오는 것이다.

 

이제 플러터쪽에서 어떻게 request하는지 알게 되었으니

host에서는 이 요청을 어떻게 처리하는지 확인해보자

 

호스트쪽 코드로 이동해보면

아까 플러터에서 MethodChannel 객체를 만들때 안에 들어갔던 고유 String과 동일한 값이 여기서도 나온다.

당연히 같아야 한다. 저 고유한 값은 채널의 이름이기 때문에, 이름이 같아야 서로 같은 채널로 연결이 된다.

코틀린 sdk가 없어서... 색깔이 단색인점은 이해바랍니다 

 

아무튼 그 아래부분을 보자

OnCreate에, MethodChannel을 만들었다. 그리고 뒤에 setMethodCallHandler 를 붙였는데 이름에서 직관적으로 이해가 되는가?

flutterView에서, METHOD_CHANNEL(아까 고유한 채널이름, String 값)로 오는 메소드 콜을 처리해주는 객체를 만드는 것이다. 그리고 그에 따른 메소드 실행을 해주는 모습이다.

(우리가 코드로 봤던 메소드 콜은 (_getOSVersion()에서 "getOSVersion") 이다.)

 

getOSVersion은 이렇게 생겼다. 해당 값을 VERSION.RELEASE를 통해 OS에서 얻어들이고

혹시 문제가 없는지 체크해서 success인지, error를 내보낼지 정해준다.

여기서 error를 보내면 플러터에선 try/catch로 대응했기 때문에 괜찮다.

 

 

이렇게 메소드채널에 대해서 알아보았다.

 

그렇다면, Event Channel은 무엇이 다를까? 간단하게 보자면...

 

Method Channel하고 원리는 같다.

 

다만 성격이 다른데, Event Channel은 Stream이다. 그래서 OS에서 지속적으로 확인을하고

Event가 발생하면 Flutter app으로 알려준다.

 

Method Channel의 경우 앱에서 쏘면 알려주지만, 

Event Channel의 경우 OS에서 stream으로 계속 Event발생에 대응한다.

 

 

다만 아쉬운 점은, 이렇게 host쪽에서 host API를 실행하기 위해선 결국 host의 고유플랫폼으로 코딩을 해야한다는 점이다. 즉 안드로이드면 안드로이드 코딩을 할 줄 알아야 한다는 뜻이다.

 

 

 

 

참고

https://www.youtube.com/watch?v=j6zkKcRyXXw

https://medium.com/@igaurab/event-channels-in-flutter-2b4d0db0ee4f

 

Event Channels in Flutter

I was recently making a plugin for the Flutter Maps which would handle and track the current location of the user and plot on to the map…

medium.com

이 글은 Event Channel에 대해 상세히 나와있음

 

코드

 

https://github.com/SAGARSURI/NoPlugins

 

SAGARSURI/NoPlugins

A simple app showing the use of Platform channels. Contribute to SAGARSURI/NoPlugins development by creating an account on GitHub.

github.com

 

반응형
Comments