Flutter 가 Android Native 를 호출 하 는 방법 에 대해 자세히 알 아 보기

Flutter 가 Android Native 를 호출 하 는 방법 은 MethodChannel 방식 으로 이 루어 집 니 다.
Android 쪽:
  • 클래스 를 만 들 고 FlutterPlugin 과 MethodCallHandler 인터페이스
  • 를 실현 합 니 다.
  • onAttachedToEngine(),onDetachedFromEngine(),onMethodCall()
  • 재 작성
  • onAttachedToEngine()에서 사용자 정의 CHANNELNAME MethodChannel 생 성,onDetachedFromEngine 에서 MethodChannel 방출
  • onMethodCall 에서 사용자 정의 METHODNAME,Flutter 에서 invokeMethod 가 Native 에 대한 통신 에 응답 합 니 다.코드 는 다음 과 같 습 니 다
  • 
    class MethodChannelPlugin : FlutterPlugin, MethodChannel.MethodCallHandler {
    
      private var methodChannel: MethodChannel? = null
      private var mNoteForFlutterListener: NoteForFlutterListener? = null
    
      companion object {
        private const val CHANNEL_NAME = "method_channel"
        private const val METHOD_NAME = "saveNote"
        val instance: MethodChannelPlugin by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {
          MethodChannelPlugin()
        }
      }
    
      override fun onAttachedToEngine(binding: FlutterPlugin.FlutterPluginBinding) {
        methodChannel = MethodChannel(binding.binaryMessenger, CHANNEL_NAME)
        methodChannel?.setMethodCallHandler(this)
      }
    
      override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) {
        methodChannel?.setMethodCallHandler(null)
        methodChannel = null
      }
    
      override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) {
        if (call.method == METHOD_NAME) {
          val content = call.argument<String>("content")
          mNoteForFlutterListener?.sendData(content!!)
          result.success("success")
        } else {
          result.notImplemented()
        }
      }
    
      fun setListener(noteForFlutterListener: NoteForFlutterListener) {
        mNoteForFlutterListener = noteForFlutterListener
      }
    
    
    Flutter 끝 에서:
  • Native 에서 정의 하 는 METHODNAME 에서 MethodChannel 만 들 기
  • MethodChannel.invokeMethod(METHODNAME,params),파라미터 METHODNAME 는 Native 에서 정의 하 는 METHODNAME,params 가 전달 하 는 매개 변 수 는 Native 와 통신 할 수 있 습 니 다.Native 의 onMethodCall 방법 에서 call.method==METHODNAME 에서 Flutter 가 Native 에서 정의 한 METHOD 를 호출 했 는 지 확인 합 니 다.NAME 의 방법,코드 는 다음 과 같 습 니 다
  • 
    class NoteMainFulState extends State<NoteMainFul> {
     //flutter   native   
     static const _methodMessageChannel = MethodChannel("method_channel");
     TextField textField;
     TextEditingController textEditingController;
    
     @override
     Widget build(BuildContext context) {
      return Scaffold(
       body: Container(
        margin: EdgeInsets.fromLTRB(20.0, 60.0, 20.0, 20.0),
        child: Column(
         children: [
          Container(
           child: Column(
            children: [
             textField = TextField(
              //     
              decoration: InputDecoration(border: InputBorder.none),
              enabled: true,
              controller: textEditingController = NoteTextEditingController(),
              keyboardType: TextInputType.multiline,
              textInputAction: TextInputAction.newline,
              maxLines: null,
             ),
             RichText(
              text: TextSpan(),
             ),
            ],
           ),
          ),
          Container(
           color: Colors.deepPurple,
           height: 50,
           child: Row(
            mainAxisAlignment: MainAxisAlignment.spaceEvenly,
            children: [
             GestureDetector(
              child: Icon(
               Icons.forward,
              ),
              onTap: clickOut,
             )
            ],
           ),
          )
         ],
        ),
       ),
      );
     }
    
     void clickOut() async {
      //  native  ,    
      var content = textEditingController.text;
      Map<String, dynamic> map = {"content": content};
      var result = await _methodMessageChannel.invokeMethod("saveNote", map);
      print("result $result");
     }
    
    
    이상 은 Flutter 가 Android Native 를 호출 하 는 방법 입 니 다.시간 이 있 으 면 그들의 실현 원 리 를 다시 분석 해 보 세 요.
    계속...
    첨부,나의 현재 Flutter 버 전 은:
    Flutter 1.22.3 • channel stable • https://github.com/flutter/flutter
    Framework • revision 8874f21e79 (3 months ago) • 2020-10-29 14:14:35 -0700
    Engine • revision a1440ca392
    Tools • Dart 2.10.3
     플 루 터 가 안 드 로 이 드 네 이 티 브 를 호출 하 는 방법 에 대한 자세 한 설명 은 여기까지 입 니 다.더 많은 플 루 터 가 안 드 로 이 드 네 이 티 브 를 호출 하 는 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!

    좋은 웹페이지 즐겨찾기