/ / Come implementare un gestore di metodi di FlutterPlugin in Swift? - rapido, svolazzare

Come implementare un gestore di metodi di FlutterPlugin in Swift? - rapido, svolazzare

Sto cercando di usare Flutter per scrivere un'app mobile. Sfortunatamente, ho bisogno di implementare un plugin Flutter per poter chiamare alcune API native.

Objective-C è troppo alieno per me, quindi preferisco usare Swift (che non conosco bene ma è abbastanza vicino a Kotlin che mi sembra familiare) per creare il plugin.

Ho ottenuto il setup dello scheletro del plugin di Flutter, ma ora sto cercando di implementare la funzione del gestore di metodo:

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

La funzione nativa che sto cercando di usare ha questa firma (generata con gomobile):

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

Non capisco però molte cose:

  1. come restituire un errore usando il result oggetto?
  2. come segnalare che il metodo non è implementato?
  3. come usare la funzione nativa "s error oggetto?

Posso trovare solo esempi Objective-C, non un singolo campione Swift ottenuto da Google su Google (l'unico campione che ho trovato non ha gestito errori o quant'altro).

Questo è quello che ho ottenuto finora:

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
}
}

Apprezzerei davvero qualsiasi aiuto.

risposte:

1 per risposta № 1

Sono riuscito a capirlo da solo leggendo alcuni esempi di codice Swift che chiama Objective-C e ispeziona le sorgenti Objective-C.

Ecco come l'ho implementato:

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)
}
}
}

Suggerimenti per miglioramenti sono ben accetti!