Получить определенные данные документов из магазина, чтобы заполнить раскрывающийся список - PullRequest
0 голосов
/ 18 апреля 2020

Я пытаюсь заполнить свой выпадающий список данными из магазина. Я хочу сделать это как можно более легким, без сортировки потоков и других ненужных мне вещей. Я создал в своих службах многоразовый вызов в Firestore, чтобы получить только те документы, которые мне нужны

  Future<List<Map<String, dynamic>>> getCollections<T>(String path) async {
    final data = await Firestore.instance.collection(path).getDocuments();
    final result = data.documents.map((doc) => doc.data).toList();
    return result;
  }

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

  Future<List<Map<String, dynamic>>> brandStream() =>
      _service.getCollections('all_brands');

И затем вызываю пока что в моей кнопке для печати данных

           onPressed: () async {
              final database =
                  Provider.of<Database>(context, listen: false);
              var r = await database.brandStream();
              print(r);
            }

Все это работает, но, очевидно, оно также извлекает данные, которые меня не интересуют. Мне нужно только из каждой коллекции получить имя и URL-адрес изображения, но я получить все другие вещи, которые находятся в этой коллекции. Каков наилучший способ сделать это? Я не могу понять, как добавить данные в класс модели, который содержит только имя и URL (как в моем предыдущем вопросе) Возвращает список из коллекций пожарного магазина

1 Ответ

1 голос
/ 18 апреля 2020

Вы должны включить T Builder в свой сервисный файл, как это

  Future<List<T>> getCollections<T>(
      {String path,
      @required
          T builder(Map<String, dynamic> data, String documentID)}) async {
    final data = await Firestore.instance.collection(path).getDocuments();
    final result =
        data.documents.map((doc) => builder(doc.data, doc.documentID)).toList();
    return result;
  }

, затем в вашем файле базы данных используйте конструктор, чтобы добавить данные в класс вашей модели

  @override
  Future<List<Brand>> brandStream() => _service.getCollections(
      path: 'tool_bank', builder: (data, id) => Brand.fromMap(data, id));

, где класс вашей модели должен выглядеть следующим образом

class Brand {
  String logo, name, bid;
  Brand({this.logo, this.name, this.bid}); 

  factory Brand.fromMap(Map<String, dynamic> brandData, String documentID) {
    if (brandData == null) {
      return null;
    }
    final String logo = brandData['logo'];
    final String name = brandData['logo'];

    return Brand(logo: logo, name: name, bid: documentID);
  }
}

Тогда вы можете использовать его так же, как вы его используете

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