Как отправить список в качестве параметра Firebase Functions в Flutter? - PullRequest
2 голосов
/ 25 мая 2019

Хотелось бы узнать, как отправить или опубликовать список (карт) с помощью плагина Cloud Functions для Flutter .

У меня есть несколько таких карт:

var customer1 = {'name':'tom','lastname':'smith'}; 
var customer2 = {'name':'bob','lastname':'lee'}; 
var customer3 = {'name':'george','lastname':'collins'};

Эти карты позже становятся списком:

var _customerList = [customer1, customer2, customer3];

Я пытаюсь отправить или опубликовать этот список в качестве параметра облачных функций для флаттера следующим образом:

   var _data = {
      'customerList': _customerList,
    };

    final HttpsCallable callable = CloudFunctions.instance
        .getHttpsCallable(functionName: 'createCustomer')
      ..timeout = const Duration(seconds: 30);

    final HttpsCallableResult result = await callable.call(_data);

Однако я получаю эту ошибку:

I/flutter (11486): Invalid argument: Instance of ...

Если я пытаюсь опубликовать простую строку, все работает нормально. Тем не менее, похоже, что я не публикую список карт правильно.

Я использую эту версию плагина:

dependencies:
  cloud_functions: ^0.3.0+1

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 25 мая 2019

Простой способ сериализации / десериализации сложных структур данных в объекты Json заключается в использовании пакета

marshalling.

Прототип (в формате "yaml")

json_objects.yaml

Customer:
  name: String
  lastname: String  
CustomerList:
  customerList: List<Customer>

Автоматическая генерация кода (с помощью утилиты "yaml2podo")

pub global run marshalling:yaml2podo json_objects.yaml

json_objects.dart

// Generated by tool.

import 'package:marshalling/json_serializer.dart';

final json = JsonSerializer()
  ..addType(() => Customer())
  ..addType(() => CustomerList())
  ..addIterableType<List<Customer>, Customer>(() => <Customer>[])
  ..addAccessor('customerList', (o) => o.customerList, (o, v) => o.customerList = v)
  ..addAccessor('lastname', (o) => o.lastname, (o, v) => o.lastname = v)
  ..addAccessor('name', (o) => o.name, (o, v) => o.name = v)
  ..addProperty<Customer, String>('name')
  ..addProperty<Customer, String>('lastname')
  ..addProperty<CustomerList, List<Customer>>('customerList');

class Customer {
  String name;
  String lastname;

  Customer();

  factory Customer.fromJson(Map map) {
    return json.unmarshal<Customer>(map);
  }

  Map<String, dynamic> toJson() {
    return json.marshal(this) as Map<String, dynamic>;
  }
}

class CustomerList {
  List<Customer> customerList;

  CustomerList();

  factory CustomerList.fromJson(Map map) {
    return json.unmarshal<CustomerList>(map);
  }

  Map<String, dynamic> toJson() {
    return json.marshal(this) as Map<String, dynamic>;
  }
}

Использовать сгенерированный код (автоматическая сериализация / дериализация объектов)

import 'json_objects.dart';

void main() {
  var customers = <Customer>[];
  var customer = Customer()
    ..name = 'tom'
    ..lastname = 'smith';
  customers.add(customer);
  customer = Customer()
    ..name = 'bob'
    ..lastname = 'lee';
  customers.add(customer);
  customer = Customer()
    ..name = 'george'
    ..lastname = 'lee';
  customers.add(customer);
  var customerList = CustomerList();
  customerList.customerList = customers;
  var data = customerList.toJson();
  // final HttpsCallableResult result = await callable.call(data);
  print(data);
}

Результат:

{customerList: [{name: tom, lastname: smith}, {name: bob, lastname: lee}, {name: george, lastname: lee}]}

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