Flutter(Dart) 코드가 폰의 네이티브(iOS/Android) 세계와 만나는 지점들. 순수 웹앱엔 없는 개념. (일반 개념)
BLE, NFC, VoIP 같은 건 네이티브만 할 수 있다. Dart와 네이티브 코드가 대화하는 통로가 MethodChannel이다.
const channel = MethodChannel('com.myapp/voip');
await channel.invokeMethod('startRTC'); // Dart → 네이티브 호출
웹으로 치면 브라우저 JS가 네이티브 브리지(예: postMessage)로 OS 기능을 부르는 것과 비슷하다.
Dart는 기본적으로 한 스레드로 돌지만, 무거운 작업이나 백그라운드 처리를 위해 **메모리를 공유하지 않는 별도 실행 환경(isolate)**을 띄울 수 있다. JS의 Web Worker와 비슷하다.
예: 앱이 꺼져 있을 때 푸시가 오면, OS가 앱 전체 대신 백그라운드 핸들러만 돌리는 새 isolate를 띄운다. 그래서 그 안에선 Firebase 같은 걸 다시 초기화해야 한다(메모리 공유 안 됨).
isolate가 이름으로 찾아가는 top-level 함수에 붙인다. 컴파일러가 "아무도 안 부르네" 하고 지워버리면 백그라운드 핸들러를 못 찾는다. 그걸 막는 표시.
@pragma('vm:entry-point')
Future<void> backgroundHandler(msg) async { ... }
앱 전체에서 딱 하나만 존재하는 객체. 설정·환경·매니저 같은 것에 쓴다.
class Environment {
static late Environment _instance;
factory Environment.init(type) {
_instance = Environment._internal();
return _instance;
}
static Environment get instance => _instance;
}
factory 생성자는 "새 객체를 만들지 않고 기존것을 돌려줌 수도 있는" 특수 생성자. JS에서 모듈 스코프에 객체 하나 만들어 export하는 싱글턴 패턴과 같다.