You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 15:15:08