일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Column Widget
- navigator
- HTTP
- InkWell
- Flutter 강좌
- Flutter 예제
- listview
- Scaffold
- AppBar
- FutureBuilder
- Flutter 앱 배포
- ListView.builder
- ListTile
- Flutter Example
- Snackbar
- Image.network
- MainAxisAlignment
- Row Widget
- Hello World
- Flutter Tutorial
- Load Image
- flutter
- Cached Image
- CrossAxisAlignment
- Networking
- 반석천
- node.js
- sqlite
- WillPopScope
- Row
- Today
- Total
꿈꾸는 시스템 디자이너
Flutter 강좌 - 플랫폼간 메소드 호출 #5 - MethodChannel을 이용한 오브젝트 교환 방법 | How to exchange object using MethodChannel 본문
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 강좌 시즌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 형태로 변화되어야 하기 때문 각 플랫폼 별로 인스턴스를 맵으로 변환하고, 수신한 맵을 다시 인스턴스로 구성하여 이용하게 된다.