Flutter通过iOS平台方法调用Toast_Swift显示自定义Toast
解决Flutter iOS方法通道中使用Toast_Swift显示Toast的问题
你的核心问题是AppDelegate本身没有view属性,Toast_Swift的方法是UIView的扩展,需要调用当前FlutterViewController的view来显示Toast,而非self.view。以下是具体修改方案:
方案一:保存FlutterViewController实例为属性
将FlutterViewController声明为AppDelegate的实例变量,在showCustomToast中直接访问它的view:
import UIKit import Flutter import Toast_Swift @UIApplicationMain @objc class AppDelegate: FlutterAppDelegate { // 声明FlutterViewController属性 private var flutterVC: FlutterViewController? override func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { // 保存FlutterViewController实例 flutterVC = window?.rootViewController as? FlutterViewController guard let controller = flutterVC else { fatalError("Failed to get FlutterViewController") } let channel = FlutterMethodChannel(name:"samples.flutter.dev/toast", binaryMessenger:controller.binaryMessenger) channel.setMethodCallHandler({ [weak self] (call: FlutterMethodCall, result: @escaping FlutterResult) -> Void in guard call.method == "getToast" else { result(FlutterMethodNotImplemented) return } self?.showCustomToast() }) GeneratedPluginRegistrant.register(with: self) return super.application(application, didFinishLaunchingWithOptions: launchOptions) } private func showCustomToast() { let myView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 80.0, height: 400.0)) // 使用保存的FlutterViewController的view调用Toast方法 flutterVC?.view.makeToast("This is a piece of toast") flutterVC?.view.showToast(myView) } }
方案二:在showCustomToast中直接获取当前ViewController
若不想保存实例变量,可直接从window获取当前根视图控制器:
private func showCustomToast() { let myView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 80.0, height: 400.0)) // 安全获取FlutterViewController的view guard let flutterVC = window?.rootViewController as? FlutterViewController else { print("Cannot access FlutterViewController") return } // 调用Toast_Swift方法,可自定义参数 flutterVC.view.makeToast("This is a piece of toast", duration: 3.0, position: .top) flutterVC.view.showToast(myView) }
关键说明
- Toast_Swift的所有方法都是UIView的扩展方法,必须通过已存在的UIView实例调用,FlutterViewController的view是当前界面的根视图,适合作为调用载体。
- 避免使用强制解包(
as!),改用as?配合guard语句处理可选值,防止崩溃。 - 可根据需求自定义Toast的样式、位置、时长,甚至添加标题、图片或点击回调。
内容的提问来源于stack exchange,提问作者Shubham Hande
相关产品推荐
相关产品推荐

