Метод Flutter Channel String не работает как URL - PullRequest
0 голосов
/ 01 июня 2019

В моем проекте Flutter есть метод Channel, который берет строку (url), загружает изображение и представляет его как часть нового контакта.

Однако изображение не будет отображаться для большинства URL-адресов.

Это код, который я использую для получения изображения и добавления к новому контакту, прежде чем отобразить его в CNContactViewController.

let urlString : String = (arguments["imgUrl"] as? String)!
            let url = URL(string: urlString)
            let data = try? Data(contentsOf: url!)
            newContact.imageData = data

Я попытался закодировать URL и привести его как NSString, но безуспешно.

Интересно, если я жестко закодирую URL, как показано ниже, это работает. Так что же происходит между отправкой его из моего исходного кода Dart в Swift?

(URL изменен для сокрытия содержимого, реальный URL возвращает изображение)

let url = URL(string: "https://23ee7ca4ch9430946b76-4f3bba1a032272305d39a357e474f3b2.ssl.cf1.rackcdn.com/talent/81843293_1556369106.jpeg")
            let data = try? Data(contentsOf: url!)
            newContact.imageData = data

Обновление:

Вот полный код ...

Дарт:

static const platform = const MethodChannel('contacts');

  static Future<String> addSystemContact({
    String firstName,
    String lastName,
    String jobTitle,
    String company,
    String phone,
    String email,
    String city,
    String country,
    String profile,
    String imgUrl,
  }) async {
    try {
      var result = await platform.invokeMethod(
          'addSystemContact',
          {
            'firstName' : firstName != null && firstName.isNotEmpty ? firstName : "",
            'lastName' : lastName != null && lastName.isNotEmpty ? lastName : "",
            'jobTitle' : jobTitle,
            'company' : company,
            'phone' : phone,
            'email' : email,
            'city' : city,
            'country' : country,
            'profile' : profile,
            'imgUrl': imgUrl,
          },
      );
      return result;
    } on PlatformException catch (e) {
      return null;
    }
  }

Swift:

let controller : FlutterViewController = window?.rootViewController as! FlutterViewController
    let contactChannel = FlutterMethodChannel(name: "contacts", binaryMessenger: controller)
    contactChannel.setMethodCallHandler({(call: FlutterMethodCall, result: @escaping FlutterResult) -> Void in
        //ADD SYSTEM CONTACT
        //
        if (call.method == "addSystemContact") {
            let arguments : Dictionary = call.arguments as! Dictionary<String,Any>
            guard let firstName : String = arguments["firstName"] as? String else { return result(false); }
            guard let lastName : String = arguments["lastName"] as? String else { return result(false); }

            //create contact
            let newContact = CNMutableContact()
            newContact.contactType = CNContactType.person
            newContact.givenName = firstName
            newContact.familyName = lastName

            if let jobTitle : String = arguments["jobTitle"] as? String {
                newContact.jobTitle = jobTitle
            }
            if let company : String = arguments["company"] as? String {
                newContact.organizationName = company
            }
            if let phone : String = arguments["phone"] as? String {
                newContact.phoneNumbers = [CNLabeledValue(
                    label:CNLabelPhoneNumberMain,
                    value:CNPhoneNumber(stringValue:phone))]
            }
            if let email : NSString = arguments["email"] as? NSString {
                newContact.emailAddresses = [CNLabeledValue(label:CNLabelWork, value:email)]
            }

            let address = CNMutablePostalAddress()
            if let city : String = arguments["city"] as? String {
                address.city = city
            }
            if let country : String = arguments["country"] as? String {
                address.country = country
            }
            newContact.postalAddresses = [CNLabeledValue(label:CNLabelWork, value:address)]

            if let profile : String = arguments["profile"] as? String {
                newContact.socialProfiles = [CNLabeledValue(label: 

CNSocialProfileServiceLinkedIn, value: CNSocialProfile.init(urlString: profile, username: nil, userIdentifier: nil, service: nil))]
                }

                // Offending code...
                //
                let urlString : String = (arguments["imgUrl"] as? String)!

                let url = URL(string: urlString)
                let data = try? Data(contentsOf: url!)
                newContact.imageData = data
                //
                //

                //presents nav controller with CNContactViewController
                self.displayConactViewController(newContact: newContact, result: result)
            }
        })

1 Ответ

0 голосов
/ 01 июня 2019

У вас, кажется, есть смесь методологий.Вы передаете одну строку в качестве аргумента или карту?К сожалению, вы не показываете конец дротика.

Вот несколько рабочих примеров, адаптированных из рабочего плагина.

Single String

Конец дротика

  static void ping(String pong) {
    _channel.invokeMethod('ping', pong);
  }

Конец Swift - call.arguments является String

case "ping":
  NSLog("ping")
  if let pong = call.arguments as! String  {
    // do something
  } else {
    NSLog("ping - Invalid Args")
  }
  break

Строка в качестве члена карты

Конец дротика

  static void foo(String bar, String baz) {
    _channel.invokeMethod('foo', <String, dynamic>{
      'bar': bar,
      'baz': baz,
    });
  }

Конец Swift - call.arguments является Dictionary

case "foo":
  NSLog("foo")
  if let args = call.arguments as? Dictionary<String, Any>, let bar = args["bar"] as! String {
    // do something with bar and/or args["baz"] as! String
  } else {
    NSLog("foo - Args is not a Dictionary")
  }
  break
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...