개요
회사에서 Android/iOS Native로 개발된 SDK를 Flutter에서 사용하기 위해 알게 된 내용을 정리한 글이다.
Flutter의 구조
Flutter App(client)와 각 platform host로의 통신은 다음과 같은 흐름을 가진다.
이 때, 메시지와 응답은 비동기적으로 처리된다. 유의해야할 점은 Flutter가 Dart를 통해 channel method를 비동기로 실행했더라도, 해당하는 실제 platform method는 메인 스레드에서 호출해야 한다. [참고]
MethodChannel은 각 platform에 맞는 method 호출이 가능하게 한다. 이 클래스를 통해 약간의 보일러 플레이트를 통해 Plugin을 개발할 수 있다. 이 때, 각 platform에 맞게 변화하는 codec과정이 필요하다.
Method Channel을 구현하는 자세한 방법은 공식 문서를 참고하라.
Pigeon
위의 MethodChannel에서는 type-safe하지 않다는 단점이 있다. Pigeon을 사용하면 type-safe하게 메소드를 호출할 수 있다.
Pigeon file:
import 'package:pigeon/pigeon.dart';
class SearchRequest {
String query = '';
}
class SearchReply {
String result = '';
}
@HostApi()
abstract class Api {
Future search(SearchRequest request);
}
Dart usage:
import 'generated_pigeon.dart';
Future<void> onClick() async {
SearchRequest request = SearchRequest()..query = 'test';
Api api = SomeApi();
SearchReply reply = await api.search(request);
print('reply: ${reply.result}');
}
Native View를 Flutter에 hosting하는 방법
Android
Flutter는 Android Native View를 hosting하는 방식이 두 가지이다. 무엇을 사용할 지는 상황에 따라 다르다.
1. Virtual Display
- android.view.View 객체를 texture로 렌더링하여 Activity의 view hierarchy에 추가되지 않는다. 키보드 처리 및 접근성 기능과 같은 특정 플랫폼 상호작용이 동작하지 않을 수 있다.
2. Hybrid composition
- android.view.View 객체를 view hierarchy에 추가하여 키보드 처리 및 접근성 기능은 기본적으로 동작한다. 하지만, Android 10 이전일 경우 성능 문제에 의해 프레임 드랍이 나타난다.
iOS
Flutter는 iOS의 경우에는 Hybrid Composition만 제공한다. 즉, UIView는 view hierarchy에 추가된다.
성능 개선 방법
- 애니메이션이 렌더링되는 동안 placeholder texture를 사용하라. 즉, platform view가 렌더링되는 동안 애니메이션이 느릴 때 native view의 스크린샷을 통해 렌더링하는 것을 고려하라.