Как реализовать обработчик метода FlutterPlugin в Swift? - PullRequest
0 голосов
/ 28 апреля 2018

Я пытаюсь использовать Flutter для написания мобильного приложения. К сожалению, мне нужно реализовать плагин Flutter, чтобы иметь возможность вызывать некоторые нативные API.

Objective-C слишком чужд для меня, поэтому я действительно предпочитаю использовать Swift (который я тоже не очень хорошо знаю, но он достаточно близок к Kotlin, чтобы я с ним знаком) для создания плагина.

Flutter установил скелет плагина, но сейчас я пытаюсь реализовать функцию обработчика метода:

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

Собственная функция, которую я пытаюсь использовать, имеет следующую подпись (сгенерированную с помощью gomobile):

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

Хотя я не понимаю нескольких вещей:

  1. как вернуть ошибку, используя объект result?
  2. как сообщить, что метод не реализован?
  3. как использовать объект error встроенной функции?

Я могу найти только примеры Objective-C, ни один образец Swift, найденный Googling (единственный найденный образец, не обрабатывал ошибки или что-то еще).

Это то, что у меня так далеко:

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 Ответ

0 голосов
/ 29 апреля 2018

Мне удалось выяснить это самостоятельно, прочитав несколько примеров кода 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)
        }
    }
}

Предложения по улучшению приветствуются!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...