플러터에서 네이티브와 메소드채널을 통해 통신한다는 사실만 알고있었고 구현해보거나, 코드를 본적이 없었다.
정말 궁금했었는데 유튜브 오준석님의 페이지에 좋은 영상이 있어 시청 후 개인적으로 문서화를 한다.
플러터는 메소드 채널을 이용하여 네이티브와 통신하는데 이것은 비동기적으로 작동한다.
static const platform = const MethodChannel('example.com/value');
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; });
}
Text('$_value'),
RaisedButton(
child: Text('네이티브 값 얻기'),
onPressed: _getNativeValue,
);
flutterProject>android>src>main>kotlin>mainActivvity 파일로 이동
상단에 안드로이드 SDK가 설정되어있지 않다 라고 표시됩니다.
컨피규어를 누릅니다.
안드로이드 sdk가 없다면 안드로이드가 설치된 경로를 등록한다(아마 설치되어있을거임)
확인
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()
}
}
}
}
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)
}
}
생각보다 어렵지 않은것같다. 다만 스위프트, 코틀린 문법과 네이티브를 사용할줄 모르다 보니 네이티브 공부가 필요해 보인다..