Flutter๋ Google์ด ๊ฐ๋ฐํ UI ํดํท์ผ๋ก, ๋จ์ผ ์ฝ๋๋ฒ ์ด์ค์์ ๋ชจ๋ฐ์ผ, ์น, ๋ฐ์คํฌํฑ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค์ดํฐ๋ธ๋ก ์ปดํ์ผํ์ฌ ๊ฐ๋ฐํ ์ ์์ต๋๋ค. Dart ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ์ฌ์ฉํ๋ Flutter๋ ๋ค์ดํฐ๋ธ ์ฝ๋์ ์ํธ์์ฉํ๊ธฐ ์ํด Event Channel๊ณผ Method Channel์ด๋ผ๋ ๋ ๊ฐ์ง ์ฃผ์ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค. ์ด ์ฑ๋๋ค์ Flutter ์ฑ๊ณผ ํ๋ซํผ๋ณ ์ฝ๋๋ฅผ ์ฐ๊ฒฐํด ๋ค์ดํฐ๋ธ ๊ธฐ๋ฅ์ ์ํํ ํ์ฉํ ์ ์๋๋ก ํฉ๋๋ค.
๋ชจ๋ฐ์ผ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์์๋ ํ๋ซํผ๋ณ API๋ ์๋น์ค๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์ข ์ข ์์ต๋๋ค. Flutter์ Event Channel๊ณผ Method Channel์ ์ด๋ฌํ ํ์๋ฅผ ์ถฉ์กฑํ๊ธฐ ์ํ ๊ฐ๋ ฅํ ํ๋ ์์ํฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ฅผ ํตํด Flutter ์ฑ์์ ๋ค์ดํฐ๋ธ ์ฝ๋๋ฅผ ํตํฉํ์ฌ ๋ ๊ฐ๋ ฅํ๊ณ ์ ์ฐํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ์ ์์ต๋๋ค.
Method Channel์ Flutter์ ๋ค์ดํฐ๋ธ ์ฝ๋ ๊ฐ์ ํต์ ์ ์ํด ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด Dart์์ ๋ค์ดํฐ๋ธ ๋ฉ์๋๋ฅผ ํธ์ถํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค. ์ฃผ๋ก ํ ๋ฒ์ ์์ฒญ๊ณผ ์๋ต์ด ํ์ํ ๊ฒฝ์ฐ์ ์ ํฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด, Flutter ์ฑ์ด ํน์ ๊ธฐ๋ฅ์ ํธ์ถํ๊ณ ์๋ต์ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒฝ์ฐ ์ฌ์ฉ๋ฉ๋๋ค.
Event Channel์ ์ง์์ ์ธ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ค๊ณ๋์์ต๋๋ค. ๋ค์ดํฐ๋ธ ์ธก์์ Flutter๋ก ๋ฐ์ดํฐ๋ฅผ ์คํธ๋ฆผ ํ์์ผ๋ก ์ ์กํ ์ ์๋ ํต์ ํจํด์ ์ ๊ณตํฉ๋๋ค. ์ผ์ ๋ฐ์ดํฐ๋ ๋คํธ์ํฌ ์ฐ๊ฒฐ ์ํ์ ๊ฐ์ด ์ค์๊ฐ ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ฌํญ์ ์์ ํด์ผ ํ๋ ๊ฒฝ์ฐ์ ์ ์ฉํฉ๋๋ค.
Flutter๋ ๊ด๋ฒ์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง๋ง, ํน์ ๊ธฐ๋ฅ์ ๋ค์ดํฐ๋ธ API๋ฅผ ํตํด ์ฒ๋ฆฌํ๋ ๊ฒ์ด ๋ ์ ํฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ผ์ ๋ฐ์ดํฐ ์ ๊ทผ, ์นด๋ฉ๋ผ, ๋ฐฐํฐ๋ฆฌ ์ํ ํ์ธ ๋๋ ํ๋ซํผ๋ณ ์๋น์ค๋ฅผ ํตํฉํ๋ ์์ ์ด ์ด์ ํด๋นํฉ๋๋ค. Method Channel๊ณผ Event Channel์ ์ด๋ฌํ ์ํธ์์ฉ์ ์ํ ๋ค๋ฆฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
Method Channel์ ํ ๋ฒ์ ์์ฒญ๊ณผ ์๋ต์ด ํ์ํ ์์
์ ์ต์ ํ๋์ด ์์ด ๋น ๋ฅด๊ณ ํจ์จ์ ์ผ๋ก ์คํ๋ฉ๋๋ค.
Event Channel์ ์ง์์ ์ธ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ์ ํฉํ๋ฉฐ, Flutter ์ฑ ๋ด์์ ์ค์๊ฐ ์
๋ฐ์ดํธ์ ์๋ฆผ์ ์ ๊ณตํฉ๋๋ค.
๋จผ์ , Flutter์์ Method Channel์ ์์ฑํฉ๋๋ค.
import 'package:flutter/services.dart';
class MethodChannelExample {
static const platform = MethodChannel('com.example.methodchannel/sample');
Future<void> callNativeMethod() async {
try {
final int result = await platform.invokeMethod('getNativeData');
print("Result from native: $result");
} on PlatformException catch (e) {
print("Failed to get data: '${e.message}'");
}
}
}
๋ค์์ผ๋ก, ๋ค์ดํฐ๋ธ Android ์ฝ๋์์ ํด๋น ๋ฉ์๋๋ฅผ ๊ตฌํํฉ๋๋ค.
package com.example.methodchannel
import io.flutter.embedding.android.FlutterActivity
import io.flutter.plugin.common.MethodChannel
class MainActivity: FlutterActivity() {
private val CHANNEL = "com.example.methodchannel/sample"
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler {
call, result ->
if (call.method == "getNativeData") {
val nativeData = getNativeData()
if (nativeData != null) {
result.success(nativeData)
} else {
result.error("UNAVAILABLE", "Native data not available.", null)
}
} else {
result.notImplemented()
}
}
}
private fun getNativeData(): Int {
// ๋ค์ดํฐ๋ธ ๋ฐ์ดํฐ ๋ก์ง
return 42
}
}
Event Channel์ ์ฌ์ฉํ์ฌ ๋ฆฌ์ค๋๋ฅผ ์ค์ ํฉ๋๋ค.
import 'package:flutter/services.dart';
class EventChannelExample {
static const EventChannel eventChannel = EventChannel('com.example.eventchannel/sample');
void startListening() {
eventChannel.receiveBroadcastStream().listen((dynamic event) {
print("Event from native: $event");
}, onError: (dynamic error) {
print("Error: $error");
});
}
}
Android์์ Event Channel์ ๊ตฌํํฉ๋๋ค.
package com.example.eventchannel
import io.flutter.embedding.android.FlutterActivity
import io.flutter.plugin.common.EventChannel
import java.util.*
class MainActivity: FlutterActivity() {
private val CHANNEL = "com.example.eventchannel/sample"
private var events: EventChannel.EventSink? = null
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
EventChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setStreamHandler(
object : EventChannel.StreamHandler {
override fun onListen(arguments: Any?, events: EventChannel.EventSink?) {
this@MainActivity.events = events
startSendingEvents()
}
override fun onCancel(arguments: Any?) {
this@MainActivity.events = null
}
}
)
}
private fun startSendingEvents() {
// ์ด๋ฒคํธ๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ์ ์ก
Timer().scheduleAtFixedRate(object : TimerTask() {
override fun run() {
events?.success("Event data from native")
}
}, 0, 1000)
}
}
๋๋ฐ์ด์ค ์ ๋ณด: ๋ฐฐํฐ๋ฆฌ ์์ค, ์์คํ
๋ฒ์ ๊ณผ ๊ฐ์ ๋๋ฐ์ด์ค ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ.
๋จ๋ฐ์ฑ ์ค์ : ํ ๋ฒ์ ํธ์ถ๊ณผ ์๋ต์ด ํ์ํ ์ค์ ์์
.
๋ค์ดํฐ๋ธ UI ์ปดํฌ๋ํธ: ๋ค์ดํฐ๋ธ ๋ค์ด์ผ๋ก๊ทธ ๋๋ ์๋ฆผ๊ณผ ๊ฐ์ UI ์์์ ์ํธ์์ฉ.
์ผ์ ๋ฐ์ดํฐ: ๊ฐ์๋๊ณ, ์์ด๋ก์ค์ฝํ ๋ฑ ๋๋ฐ์ด์ค ์ผ์์์ ์ค์๊ฐ ์
๋ฐ์ดํธ ์์ .
์ค์๊ฐ ์๋ฆผ: ๋ค์ดํฐ๋ธ ์๋น์ค์์ ์ค์๊ฐ ์
๋ฐ์ดํธ ๋๋ ์๋ฆผ ์์ .
์์น ์
๋ฐ์ดํธ: ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ง์์ ์ธ ์์น ๋ณ๊ฒฝ ์ถ์ .
Flutter์ Method Channel๊ณผ Event Channel์ ๋ค์ดํฐ๋ธ ํ๋ซํผ ๊ธฐ๋ฅ๊ณผ์ ํตํฉ์ ์ํ ํ์ ๋๊ตฌ์ ๋๋ค. ์ด๋ค์ ํ์ฉํ๋ฉด Flutter ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ธฐ๋ฅ์ ํ์ฅํ๊ณ ์ฌ์ฉ์ ๊ฒฝํ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค. Method Channel์ ๋จ๋ฐ์ฑ ์์ ์, Event Channel์ ์ค์๊ฐ ๋ฐ์ดํฐ ์คํธ๋ฆผ ์ฒ๋ฆฌ์ ์ ํฉํฉ๋๋ค. ์ด๋ฌํ ์ฑ๋์ ํจ๊ณผ์ ์ผ๋ก ๊ตฌํํ๋ฉด ๋์ฑ ๊ฐ๋ ฅํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ์ ์์ต๋๋ค.