当前位置: 首页 > 知识库问答 >
问题:

如何在Swift中实现flatterplugin的方法处理程序?

花飞扬
2023-03-14

我正在尝试使用Flutter编写移动应用程序。不幸的是,我需要实现一个Flutter插件才能调用一些原生API。

Objective-C对我来说太陌生了,所以我真的更喜欢使用Swift(我也不太了解,但它离Kotlin很近,我觉得很熟悉)来创建插件。

我通过Flatter获得了插件框架设置,但现在我正在尝试实现方法处理函数

public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult)

我尝试使用的本机函数具有以下签名(使用gomobile生成):

FOUNDATION_EXPORT MobileapiDatabase* MobileapiReadDatabase(
  NSString* filePath, NSString* password, NSError** error);

但有几件事我不明白:

  1. 如何使用结果对象返回错误
  2. 如何报告未实施的方法
  3. 如何使用本机函数的错误对象

我只能找到Objective-C示例,没有通过谷歌搜索找到一个Swift示例(我找到的唯一示例没有处理错误或其他任何东西)。

这就是我到目前为止得到的:

public func handle(_ call: FlutterMethodCall, 
    result: @escaping FlutterResult) {
  switch call.method {
  case "getDb":
    let args = call.arguments as! [String]
    if args.count == 2 {
        let error = NSError() // ERROR in next line
        MobileapiReadDatabase(args[0], args[1], error)
        // how to check if there was an error?
    }
    // TODO report wrong arguments
  default:
    // TODO report method not implemented
  }
}

非常感谢您的帮助。

共有1个答案

水瀚漠
2023-03-14

通过阅读一些Swift代码调用Objective-C的示例并检查Objective-C源代码,我自己设法找到了答案。

以下是我如何实现它的:

import Flutter
import UIKit
import Mobileapi

public class SwiftGohashMobilePlugin: NSObject, FlutterPlugin {
    public static func register(with registrar: FlutterPluginRegistrar) {
        let channel = FlutterMethodChannel(name: "gohash_mobile", binaryMessenger: registrar.messenger())
        let instance = SwiftGohashMobilePlugin()
        registrar.addMethodCallDelegate(instance, channel: channel)
    }

    public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
        switch call.method {
        case "getDb":
            if let args = call.arguments as? [String] {
                if args.count == 2 {
                    var error : NSError?
                    let db = MobileapiReadDatabase(args[0], args[1], &error)
                    if let errorMessage = error?.userInfo.description {
                        result(FlutterError.init(code: "NATIVE_ERR",
                                                 message: "Error: " + errorMessage,
                                                 details: nil))
                    } else {
                        // SUCCESS!!
                        result(db!)
                    }
                } else {
                    result(FlutterError.init(code: "BAD_ARGS",
                                             message: "Wrong arg count (getDb expects 2 args): " + args.count.description,
                                             details: nil))
                }
            } else {
                result(FlutterError.init(code: "BAD_ARGS",
                                         message: "Wrong argument types",
                                         details: nil))
            }
        default:
            result(FlutterMethodNotImplemented)
        }
    }
}

欢迎提出改进建议!

 类似资料:
  • 问题内容: 如何在 Swift 3.0中 实现方法混乱? 我已经阅读了有关nshipster的文章,但是在这段代码中 编译器给我一个错误 在Swift中不可用dispatch_once_t:而是使用延迟初始化的全局变量 问题答案: 首先,在Swift 3.0中不可用。您可以选择两种选择: 全局变量 静态财产,或 令人毛骨悚然的CocoaTouch类,例如UIViewController; 定制的S

  • 问题内容: 我一直在尝试使它工作一段时间,而我来这里询问-如何在Swift中使用CLLocationManagerDelegate方法?我把它放在班上的第一位: 我在我的方法中添加了以下内容: 而且我尝试使用这些委托方法无济于事: 我也尝试过在函数前面使用@optional,但是Xcode会引发编译器错误。有任何想法吗? 问题答案: 如果尚未添加,则需要将或键添加到您的plist中,因为它们现在是

  • 本文向大家介绍在Swift程序中实现手势识别的方法,包括了在Swift程序中实现手势识别的方法的使用技巧和注意事项,需要的朋友参考一下 在这次IOS应用开发教程中,我们打算实现手势识别。正如你所知道的,IOS支持大量的手势操作,它们能提供了很好的应用控制和出色用户体验。 让我们开始吧! 首先需要在Xcode中创建一个新的Single View Application: 然后点击Next,弹出的窗口

  • 问题内容: 我想知道如何为在Swift 3中创建的函数创建完成处理程序。这就是我在更新到Swift 3之前就完成函数的方式: 但是现在我无法找出目前可行的最佳方法。 问题答案: 在Swift 3中,闭包中的函数参数标签不见了。 删除所有出现并添加 并使用它

  • 问题内容: 我正在使用iOS的Google Maps API,并想使用标记聚类实用程序。我想出了如何显示聚簇标记,但是我想自定义标记。有人可以解释如何设置/更改每个标记或群集标记的图标和标题吗?示例代码将非常有帮助。 到目前为止,这就是我所拥有的。我不知道该如何处理renderClusters和更新函数。 问题答案: 在 Swift 4上 ,我找到了一种针对聚簇标记的干净解决方案,可以为聚簇使用自

  • 如何在Swift中获取的处理程序。它是在初始化时设置的,但是我没有找到任何属性来保持动作的闭包。闭包是