From a5f22273845383eaccc031812973add95467281f Mon Sep 17 00:00:00 2001 From: crow Date: Thu, 8 Aug 2024 08:16:07 -0700 Subject: [PATCH] Fix method channel setup and get size method --- example/lib/screens/home.dart | 14 ++++++------ ios/Classes/AirshipEmbeddedView.swift | 31 ++++++++++++++++----------- lib/src/airship_embedded_view.dart | 18 ++++++++++++++-- 3 files changed, 42 insertions(+), 21 deletions(-) diff --git a/example/lib/screens/home.dart b/example/lib/screens/home.dart index f2611dce..83765c86 100644 --- a/example/lib/screens/home.dart +++ b/example/lib/screens/home.dart @@ -34,8 +34,8 @@ class _HomeState extends State { child: Container( alignment: Alignment.center, child: Wrap(children: [ - Center( - child:EmbeddedView(embeddedId: "hundredpxhundredpx"), + Center( + child:EmbeddedView(embeddedId: "test"), ), Image.asset( 'assets/airship.png', @@ -48,11 +48,11 @@ class _HomeState extends State { bool pushEnabled = snapshot.data ?? false; enableNotificationsButton = Center(child: NotificationsEnabledButton( - onPressed: () { - Airship.push.setUserNotificationsEnabled(true); - setState(() {}); - }, - )); + onPressed: () { + Airship.push.setUserNotificationsEnabled(true); + setState(() {}); + }, + )); return Visibility( visible: !pushEnabled, child: enableNotificationsButton); diff --git a/ios/Classes/AirshipEmbeddedView.swift b/ios/Classes/AirshipEmbeddedView.swift index 04fde64b..fbbe3cda 100644 --- a/ios/Classes/AirshipEmbeddedView.swift +++ b/ios/Classes/AirshipEmbeddedView.swift @@ -2,8 +2,8 @@ import Foundation import AirshipKit import SwiftUI -class AirshipEmbeddedViewFactory : NSObject, FlutterPlatformViewFactory { - let registrar : FlutterPluginRegistrar +class AirshipEmbeddedViewFactory: NSObject, FlutterPlatformViewFactory { + let registrar: FlutterPluginRegistrar init(_ registrar: FlutterPluginRegistrar) { self.registrar = registrar @@ -18,8 +18,7 @@ class AirshipEmbeddedViewFactory : NSObject, FlutterPlatformViewFactory { } } -/// The Flutter wrapper for the Airship embedded view -class AirshipEmbeddedViewWrapper : NSObject, FlutterPlatformView { +class AirshipEmbeddedViewWrapper: NSObject, FlutterPlatformView { private static let embeddedIdKey: String = "embeddedId" @ObservedObject @@ -27,7 +26,7 @@ class AirshipEmbeddedViewWrapper : NSObject, FlutterPlatformView { public var viewController: UIViewController? - let channel : FlutterMethodChannel + let channel: FlutterMethodChannel private var _view: UIView init(frame: CGRect, viewId: Int64, registrar: FlutterPluginRegistrar, args: Any?) { @@ -53,14 +52,22 @@ class AirshipEmbeddedViewWrapper : NSObject, FlutterPlatformView { rootView.viewModel.size = frame.size } + + channel.setMethodCallHandler { [weak self] (call: FlutterMethodCall, result: @escaping FlutterResult) in + self?.handle(call, result: result) + } } - public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) async { + public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { switch call.method { + case "getSize": + let width = _view.bounds.width + let height = _view.bounds.height + result(["width": width, "height": height]) default: - result(FlutterError(code:"UNAVAILABLE", - message:"Unknown method: \(call.method)", - details:nil)) + result(FlutterError(code: "UNAVAILABLE", + message: "Unknown method: \(call.method)", + details: nil)) } } @@ -71,7 +78,7 @@ class AirshipEmbeddedViewWrapper : NSObject, FlutterPlatformView { struct FlutterAirshipEmbeddedView: View { @ObservedObject - var viewModel:ViewModel + var viewModel: ViewModel var body: some View { if let embeddedID = viewModel.embeddedID { @@ -95,14 +102,14 @@ struct FlutterAirshipEmbeddedView: View { var height: CGFloat { guard let height = self.size?.height, height > 0 else { - return try! AirshipUtils.mainWindow()?.screen.bounds.height ?? 420 + return (try? AirshipUtils.mainWindow()?.screen.bounds.height) ?? 420 } return height } var width: CGFloat { guard let width = self.size?.width, width > 0 else { - return try! AirshipUtils.mainWindow()?.screen.bounds.width ?? 420 + return (try? AirshipUtils.mainWindow()?.screen.bounds.width) ?? 420 } return width } diff --git a/lib/src/airship_embedded_view.dart b/lib/src/airship_embedded_view.dart index a9f298b5..904f6bfb 100644 --- a/lib/src/airship_embedded_view.dart +++ b/lib/src/airship_embedded_view.dart @@ -23,11 +23,24 @@ class EmbeddedView extends StatefulWidget { class EmbeddedViewState extends State { late MethodChannel _channel; + double _nativeViewWidth = 0; + double _nativeViewHeight = 0; + @override void initState() { super.initState(); - _channel = MethodChannel('com.airship.flutter/EmbeddedView_${widget.embeddedId}'); - _channel.setMethodCallHandler(_methodCallHandler); + } + + Future _getNativeViewSize() async { + try { + final size = await _channel.invokeMethod('getSize'); + setState(() { + _nativeViewWidth = size?['width']; + _nativeViewHeight = size?['height']; + }); + } on PlatformException catch (e) { + print("Failed to get native view size: '${e.message}'."); + } } Future _methodCallHandler(MethodCall call) async { @@ -40,6 +53,7 @@ class EmbeddedViewState extends State { Future _onPlatformViewCreated(int id) async { _channel = MethodChannel('com.airship.flutter/EmbeddedView_$id'); _channel.setMethodCallHandler(_methodCallHandler); + _getNativeViewSize(); } /// Fall back to screen-sized constraints when constraints can be inferred