Flutter 混合開發系列 包含以下:android
- 嵌入原生View-Android
- 嵌入原生View-iOS
- 與原生通訊-MethodChannel
- 與原生通訊-BasicMessageChannel
- 與原生通訊-EventChannel
- 添加 Flutter 到 Android Activity
- 添加 Flutter 到 Android Fragment
- 添加 Flutter 到 iOS
每一個工做日分享一篇,歡迎關注、點贊及轉發。ios
Flutter 端建立 EventChannel 通道,用於與原生端通訊:git
var _eventChannel = EventChannel('com.flutter.guide.EventChannel');
com.flutter.guide.EventChannel 是 EventChannel 的名稱,原生端要與之對應。swift
監聽原生端發送的消息:api
var _data; @override void initState() { super.initState(); _eventChannel.receiveBroadcastStream().listen(_onData); } _onData(event){ setState(() { _data = event; }); }
Flutter 端完整代碼:微信
class EventChannelDemo extends StatefulWidget { @override _EventChannelDemoState createState() => _EventChannelDemoState(); } class _EventChannelDemoState extends State<EventChannelDemo> { var _eventChannel = EventChannel('com.flutter.guide.EventChannel'); var _data; @override void initState() { super.initState(); _eventChannel.receiveBroadcastStream().listen(_onData); } _onData(event){ setState(() { _data = event; }); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(), body: Center( child: Text('$_data'), ), ); } }
android 下建立 EventChannelDemo:app
class EventChannelDemo(var activity: Activity, messenger: BinaryMessenger):EventChannel.StreamHandler { private var channel: EventChannel private var index = 0 private var events: EventChannel.EventSink? = null init { channel = EventChannel(messenger, "com.flutter.guide.EventChannel") channel.setStreamHandler(this) startTimer() } fun startTimer() { var timer = Timer().schedule(timerTask { index++ var map = mapOf("name" to "laomeng${index}", "age" to "${index}" ) activity.runOnUiThread { events?.success(map) } }, 0, 1000) } override fun onListen(arguments: Any?, events: EventChannel.EventSink?) { this.events = events } override fun onCancel(arguments: Any?) { this.events = null } }
events?.success(map) 方法是向 Flutter 端發送數據,此方法必須在主線程執行:ide
activity.runOnUiThread { events?.success(map) }
在 MainActivity 啓動:ui
class MainActivity : FlutterActivity() { override fun configureFlutterEngine(flutterEngine: FlutterEngine) { super.configureFlutterEngine(flutterEngine) EventChannelDemo(this,flutterEngine.dartExecutor.binaryMessenger) flutterEngine.plugins.add(MyPlugin()) } }
ios 下建立 MethodChannelDemo,按以下方式:this
import Flutter import UIKit public class EventChannelDemo:NSObject, FlutterStreamHandler{ var channel:FlutterEventChannel? var count = 0 var events:FlutterEventSink? public override init() { super.init() } convenience init(messenger: FlutterBinaryMessenger) { self.init() channel = FlutterEventChannel(name: "com.flutter.guide.EventChannel", binaryMessenger: messenger) channel?.setStreamHandler(self) startTimer() } func startTimer() { let timer = Timer.scheduledTimer(timeInterval:1, target: self, selector:#selector(self.tickDown),userInfo:nil,repeats: true) } @objc func tickDown(){ count += 1 let args = ["count":count] if(events != nil){ events!(args) } } public func onListen(withArguments arguments: Any?, eventSink events: @escaping FlutterEventSink) -> FlutterError? { self.events = events return nil; } public func onCancel(withArguments arguments: Any?) -> FlutterError? { self.events = nil return nil; } }
在 AppDelegate 啓動:
import UIKit import Flutter @UIApplicationMain @objc class AppDelegate: FlutterAppDelegate { override func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { let controller : FlutterViewController = window?.rootViewController as! FlutterViewController EventChannelDemo(messenger: controller.binaryMessenger) GeneratedPluginRegistrant.register(with: self) return super.application(application, didFinishLaunchingWithOptions: launchOptions) } }
老孟Flutter博客(330個控件用法+實戰入門系列文章):http://laomengit.com
歡迎加入Flutter交流羣(微信:laomengit)、關注公衆號【老孟Flutter】:
![]() |
![]() |