[Flutter] 네이티브 코드 연동

김영진·2021년 9월 4일
0
post-custom-banner

목적

플러터에서 네이티브와 메소드채널을 통해 통신한다는 사실만 알고있었고 구현해보거나, 코드를 본적이 없었다.
정말 궁금했었는데 유튜브 오준석님의 페이지에 좋은 영상이 있어 시청 후 개인적으로 문서화를 한다.

내용

개념

플러터는 메소드 채널을 이용하여 네이티브와 통신하는데 이것은 비동기적으로 작동한다.

Flutter Code

  1. 메소드 채널 선언 및 생성
static const platform = const MethodChannel('example.com/value');
  1. 비동기 함수 선언 및 구현
String _value = 'null';

Future<void> _getNativeValue() async {
  String value;
  
  try{
    value = await platform.invokeMethod('getValue');
  } on PlatformException catch (e) {
    value = '네이티브 코드 실행 에러 : ${e.message}';
  }
  
  setState((){ _value = value; });
}
  1. 메소드 채널 호출
Text('$_value'),
RaisedButton(
  child: Text('네이티브 값 얻기'),
  onPressed: _getNativeValue,
);

Android Code

  1. flutterProject>android>src>main>kotlin>mainActivvity 파일로 이동

  2. 상단에 안드로이드 SDK가 설정되어있지 않다 라고 표시됩니다.

  3. 컨피규어를 누릅니다.

  4. 안드로이드 sdk가 없다면 안드로이드가 설치된 경로를 등록한다(아마 설치되어있을거임)

  5. 확인

  6. flutterProject>android>src>main>kotlin>mainActivvity 파일로 이동

class MainActivity: flutterActivity() {
// 코틀린에서 상수를 정의하는 방법
  companion object {
    const val CHANNEL = 'example.com/value'
  }
  
  override fun onCreate(savedInstanceState: Bundle?){
  // 건들지 않기(원래있는코드)
    super.onCreate(savedInstanceState)
    GeneratedPluginRegistrant.registerWith... 
    
    MethodChannel(flutterView, CHANNEL)
    .setMethodVallHandler {
      methodCall, result => if(methodCall.method == 'getValue') {
        result.success("성공")
      }
      else {
      	result.notImplemented()
      }
    }
  }
}

IOS Code

  1. ios > runner > appDeligate.swift 로 이동
  2. sdk 설정이 안됨
  3. xcode로 실행해야함
import UIKit
import Flutter


 class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
  
  // 추가 작성한 부분
  let controller = self.window.rootViewController as~ FlutterViewController 
  
  let channel = FlutterMethodChannel.init(name: "example.com/value", binaryMessenger: controller)
  channel.setMethodCallHandler { (call, result) in
    if(call.method == 'getValue'){
      result("성공") 
    }
    else{
      result(FlutterMethodNotImplemented)
    }
  
  // 원래 있는 코드
    GeneratedPluginRegistrant.register(with: self)
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
}

결론

생각보다 어렵지 않은것같다. 다만 스위프트, 코틀린 문법과 네이티브를 사용할줄 모르다 보니 네이티브 공부가 필요해 보인다..

profile
2021.05.03) Flutter, BlockChain, Sports, StartUp
post-custom-banner

0개의 댓글