dev/flutter

[Flutter] 네이티브(NativeView) 안드로이드(AOS)연동 액티비티(Activity)통신

캄춰 2023. 12. 27. 10:39
728x90
반응형

연결하는 방법은 서로의 채널을 맞춰주면 된다.

연습용 채널명은 "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 : 메시지의 인코딩, 디코딩 정의

728x90
반응형

'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