꿈꾸는 시스템 디자이너

Flutter 강좌 - 플랫폼간 메소드 호출 #5 - MethodChannel을 이용한 오브젝트 교환 방법 | How to exchange object using MethodChannel 본문

Development/Flutter

Flutter 강좌 - 플랫폼간 메소드 호출 #5 - MethodChannel을 이용한 오브젝트 교환 방법 | How to exchange object using MethodChannel

독행소년 2020. 4. 26. 20:07

 

Flutter Code Examples 강좌를 추천합니다.

  • 제 블로그에서 Flutter Code Examples 프로젝트를 시작합니다.
  • Flutter의 다양한 예제를 소스코드와 실행화면으로 제공합니다.
  • 또한 모든 예제는 Flutter Code Examples 앱을 통해 테스트 가능합니다.

Flutter Code Examples 강좌로 메뉴로 이동

Flutter Code Examples 강좌 목록 페이지로 이동

Flutter Code Examples 앱 설치 | Google Play Store로 이동

 

Flutter Code Examples - Google Play 앱

Are you a beginner at Flutter? Check out the various features of Flutter through the demo. Source code for all demos is also provided.

play.google.com


Flutter 강좌 시즌2 목록 : https://here4you.tistory.com/149

 

이번 강좌에서는 MethodChannel을 이용해서 Flutter와 Android간의 메소드 호출을 요청할 때 파라미터와 아규먼트로 커스텀 오브젝트를 이용하는 방법에 대해서 알아본다.

 

이름, 나이, 성별로 구성되는 Human이라는 클래스의 인스턴스를 MethodChannel을 이용해 주고 받는 것이 목적이다.

 

1. Class Model 정의

  • Flutter용 Human Class Model
class Human {
  static final String fName = "name";
  static final String fAge = "age";
  static final String fIsMale = "isMale";

  String name;
  int age;
  bool isMale;

  Human({this.name, this.age, this.isMale});

  factory Human.fromMap(Map<dynamic, dynamic> snapshot) {
    return Human(
      name: snapshot[fName] as String,
      age: snapshot[fAge] as int,
      isMale: snapshot[fIsMale] as bool,
    );
  }

  Map<String, dynamic> toMap() {
    return {
      fName: name,
      fAge: age,
      fIsMale: isMale,
    };
  }
}

 

  • Android용 Human Class Model
package com.example.passobject;


import org.json.JSONException;
import org.json.JSONObject;

public class Human {
    static final String fName = "name";
    static final String fAge = "age";
    static final String fIsMale = "isMale";


    String name;
    int age;
    boolean isMale;

    public Human(String name, int age, boolean isMale) {
        this.name = name;
        this.age = age;
        this.isMale = isMale;
    }

    static public Human fromMap(Object obj) {

        try {
            JSONObject jo = new JSONObject(obj.toString());
            return new Human(jo.getString(fName), jo.getInt(fAge), jo.getBoolean(fIsMale));
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return null;
    }

    public String toMap() {
        JSONObject jo = new JSONObject();
        try {
            jo.put(fName, name);
            jo.put(fAge, age);
            jo.put(fIsMale, isMale);
        } catch (JSONException e) {
            e.printStackTrace();
        }

        return jo.toString();
    }
}

 

플랫폼별 클래스의 구성은 위와 같이 그 구성이 동일하다. 그리고 오브젝트의 내용을 Map으로 변환하거나 Map으로부터 다시 오브젝트로 구성하기 위해 toMap 메소드와 fromMap 메소드를 각각 플랫폼에 맞게 구현하였다. 이는 MethodChannel로 파라미터를 전달할 때 커스텀 오브젝트를 직접 전달할 수 없기 때문에 맵 형태로 전달하고 다시 오브젝트로 재구성하기 위함이다.

 

 

2. 오브젝트 교환

  • Flutter -> Android
class Passobject {
  static const MethodChannel _channel = const MethodChannel('passobject');

  static Future<void> remoteMethodCall() async {
    Human sender = Human(name: "Park", age: 40, isMale: true);
    print("[F][Sender] ${sender.toMap()}");

    var result = await _channel.invokeMethod("methodCall", sender.toMap());
    Human receiver = Human.fromMap(jsonDecode(result));
    print("[F][Receiver] ${receiver.toMap()}");
    return result;
  }
}

 

  • Android -> Flutter
    @Override
    public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
        if (call.method.equals("methodCall")) {

            Human sender = Human.fromMap(call.arguments());
            System.out.println("[A][Sender] " + sender.toMap());

            Human receiver = new Human("Lee", 38, false);
            System.out.println("[A][Receiver] " + receiver.toMap());
            result.success(receiver.toMap());
        } else {
            result.notImplemented();
        }
    }

 

Flutter와 Android간의 커스텀 오브젝트를 아규먼트/파라미터로 이용하는 방식은 위와 같다. 오브젝트가 MethodChannel을 통과하기 위해서는 Map 형태로 변화되어야 하기 때문 각 플랫폼 별로 인스턴스를 맵으로 변환하고, 수신한 맵을 다시 인스턴스로 구성하여 이용하게 된다.

Comments