연결하는 방법은 서로의 채널을 맞춰주면 된다.
연습용 채널명은 "kr.co.cavedwellers"이름으로 설정
android MainActivity코드
- onConfigureFlutterEngine(flutterEngine: FlutterEngine) 오버라이드 메서드 호출
private val CHANNEL = "kr.co.cavedwellers"
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
Log.v(TAG, "configureFlutterEngine..")
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
Log.d(TAG,"MethodChannel.. call:$call")
Log.d(TAG, "MethodChannel.. result:$result")
// if (call.method.equals("message from dart")
result.success("I'm Here!")
}
}
액티비티 뷰를 띄우고 싶은 경우
- flutterEngine.platformViewController.registry.registerViewFactory에 등록
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
Log.v(TAG, "configureFlutterEngine..")
flutterEngine.platformViewsController.registry
.registerViewFactory("<platform-view-type>", NativeViewFactory())
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
Log.d(TAG,"MethodChannel.. call:$call")
Log.d(TAG, "MethodChannel.. result:$result")
// if (call.method.equals("message from dart")
result.success("I'm Here!")
}
}
네이티브 뷰
internal class NativeView(
context: Context,
id: Int,
creationsParams: Map<String?, Any?>?
):PlatformView {
private val textView:TextView
override fun getView(): View? {
return textView
}
override fun dispose() {
}
init {
textView = TextView(context)
textView.textSize = 72f
textView.setBackgroundColor(Color.rgb(255, 255, 255))
textView.text = "Rendered on a native Android view (id:$id)"
}
}
팩토리
internal class NativeViewFactory : PlatformViewFactory(StandardMessageCodec.INSTANCE) {
override fun create(context: Context, viewId: Int, args: Any?): PlatformView {
val creationsParams = args as Map<String?, Any?>?
return NativeView(context, viewId, creationsParams)
}
}
dart 호출 코드
- MethodChannel로 AOS쪽 채널명을 설정해준다.
import 'package:flutter/services.dart';
final platform = const MethodChannel('kr.co.cavedwellers');
Future<void> _sendAndroidMessage() async {
String result = await platform.invokeMethod('I am from dart');
print('result.. :$result');
}
EventChannel로 Stream형태로 받고 싶은 경우
안드로이드 코드
override fun onAttachedToEngine(flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
context = flutterPluginBinding.applicationContext
methodChannel = MehtodChannel(flutterPluginBinding.binaryMessenger, METHOD_CHANNEL_NAME)
methodChannel.setMethodCallHandler(this)
eventChannel = EventChannel(flutterPluginBinding.binaryMessenger, "채널 명")
eventChannel.setStreamHandler(object: EventChannel.StreamHandler {
override fun onListen(arguments: Any?, events: EventChannel.EventSink?) {
events?.success("deliver data")
}
override fun onCancel(arguments: Any?) {
}
})
}
다트 코드
import 'package:flutter/services.dart';
final EventChannel eventChannel = EventChannel("채널 명");
Stream<String> getStringStream() {
return eventChannel
.receiveBroadcaseStream()
.map((dynamic event) => event as int);
}
2024-01-02 추가 NativeView정보 정리
참고 블로그 : https://blog.naver.com/lmj_java/222121911315
- Register : 단일 Plugin에 대한 Context, 보통 PluginRegistry에게 id값을 제공하고 리턴 받음
- Plugin : Native코드를 포함하고 있는 다트 패키지이다.
- PlatformViewFactory : Native의 UI를 Flutter에게 제공하기 위한 Plugin의 일부
: PlatformViewFactory로 viewTypeId를 등록해주어야 추후 해당 UI를 호출하면 불러올 수 있다.
- PlatformView: Native의 객체를 Flutter의 위젯 계층 구조에 embed해주는 개념의 View...? Flutter로 UI를 뿌림
- MethodChannel : Flutter와 Native가 메시지를 주고 받는 중간 역할을 해줌 - 모든 채널은 BinaryMessenger와 Codec이 필요
- BinaryMessenger : 비동기 메시지를 Binary형태로 전달
- Codec : 메시지의 인코딩, 디코딩 정의
'dev > flutter' 카테고리의 다른 글
[Flutter] Native Plugin플러그인 정리(AOS) (0) | 2023.12.28 |
---|---|
[Flutter] Http API통신 (0) | 2023.12.27 |
[Flutter] Navigation 네비게이션 정리 (0) | 2023.12.19 |
[Flutter] 기본 위젯2 정리 (0) | 2023.12.19 |
[Flutter] 기본 위젯1 정리 (0) | 2023.12.19 |