Плагин Flutter: вызов метода iOS и Android, включая параметры, которые не работают - PullRequest
0 голосов
/ 22 декабря 2018

Пробуя мой первый плагин Flutter, я пытаюсь вызвать метод как в iOS, так и в Android-мире.Я успешно смог вызвать такой метод без каких-либо параметров.

Но теперь я хотел бы вызвать метод с параметрами.

Для iOS я не могу заставить его работать длянекоторая причина.(возможно, это просто автозаполнение, которое я продолжаю наблюдать, поскольку VSCode не выполняет автозаполнение моего кода Swift).Но, возможно, это что-то еще.Пожалуйста, помогите.

Вот мой код:

Моя библиотека (Мир флаттера) выглядит так:

import 'dart:async';
import 'package:flutter/services.dart';

class SomeName {
  static const MethodChannel _channel =
      const MethodChannel('myTestMethod');

  static Future<String> get sendParamsTest async {
    final String version = await _channel.invokeMethod('sendParams',<String, dynamic>{
        'someInfo1': "test123",
        'someInfo2': "hello",
      });
    return version;
  }
}

.

Мой плагин swift (iOS-мир) выглядит следующим образом:

import Flutter
import UIKit

public class SwiftSomeNamePlugin: NSObject, FlutterPlugin {

  public static func register(with registrar: FlutterPluginRegistrar) {
    let channel = FlutterMethodChannel(name: "myTestMethod", binaryMessenger: registrar.messenger())
    let instance = SwiftSomeNamePlugin()
    registrar.addMethodCallDelegate(instance, channel: channel)
  }

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

    // flutter cmds dispatched on iOS device :
    if call.method == "sendParams" {

      guard let args = call.arguments else {
        result("iOS could not recognize flutter arguments in method: (sendParams)") 
      }
      String someInfo1 = args["someInfo1"]
      String someInfo2 = args["someInfo2"]
      print(someInfo1)
      print(someInfo2)
      result("Params received on iOS = \(someInfo1), \(someInfo2)")
    } else {
      result("Flutter method not implemented on iOS")
    }
  }
}

В сообщениях об ошибках говорится:

note: add arguments after the type to construct a value of the type String someInfo1 = args["someInfo1"]

note: add arguments after the type to construct a value of the type String someInfo2 = args["someInfo2"]

note: use '.self' to reference the type object String someInfo1 = args["someInfo1"]

note: use '.self' to reference the type object String someInfo2 = args["someInfo2"]

warning: expression of type 'String.Type' is unused String someInfo1 = args["someInfo1"]

warning: expression of type 'String.Type' is unused String someInfo2 = args["someInfo2"]

Ответы [ 2 ]

0 голосов
/ 23 декабря 2018

С помощью miguelpruivo я нашел решение.

Вот рабочий код:

Мир Дрожания в Дартсе был верным:

import 'dart:async';
import 'package:flutter/services.dart';

class SomeName {
  static const MethodChannel _channel =
      const MethodChannel('myTestMethod');

  static Future<String> get sendParamsTest async {
    final String version = await _channel.invokeMethod('sendParams',<String, dynamic>{
        'someInfo1': "test123",
        'someInfo2': 3.22,
      });
    return version;
  }
}

.

А здесь ниже, мир iOS в Swift - теперь тоже работает ...

(dynamic Дартса соответствует Any Свифта *)

(параметр метода представляет собой словарь типа [String:Any] - вроде как часто используемый пользователем Swift userInfo - поэтому вам нужно привести к обработчику приемника) ...

import Flutter
import UIKit

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

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

    // flutter cmds dispatched on iOS device :
    if call.method == "sendParams" {

      guard let args = call.arguments else {
        return
      }
      if let myArgs = args as? [String: Any],
         let someInfo1 = myArgs["someInfo1"] as? String,
         let someInfo2 = myArgs["someInfo2"] as? Double {
        result("Params received on iOS = \(someInfo1), \(someInfo2)")
      } else {
        result("iOS could not extract flutter arguments in method: (sendParams)")
      } 
    } else if call.method == "getPlatformVersion" {
      result("Running on: iOS " + UIDevice.current.systemVersion)
    } else {
      result("Flutter method not implemented on iOS")
    }
  }
}
0 голосов
/ 22 декабря 2018

Это похоже на быструю синтаксическую ошибку.

Вы хотите сделать let someInfo1 : String = args[“someInfo1”]

...