Ошибка карты хранилища Flutter Cloud <String, dynamic> - PullRequest
0 голосов
/ 03 мая 2018

Я пытаюсь создать приложение, используя Flutter и Firestore. При загрузке коллекции из Firestore с использованием StreamBuilder для отображения ее в ListView я получаю следующую ошибку

The following assertion was thrown building StreamBuilder<QuerySnapshot>(dirty, state:
I/flutter (26287): _StreamBuilderBaseState<QuerySnapshot, AsyncSnapshot<QuerySnapshot>>#d5638):

I/flutter (26287): type '_InternalLinkedHashMap<dynamic, dynamic>' is not a subtype of type 'Map<String, dynamic>'

I/flutter (26287): where

I/flutter (26287):   _InternalLinkedHashMap is from dart:collection

I/flutter (26287):   Map is from dart:core

I/flutter (26287):   String is from dart:core

Вот как я хочу получить данные от DocumentSnapshot

class Creator {
  const Creator({this.creatorId, this.name});

  Creator.fromDoc(DocumentSnapshot doc) : this.fromMap(doc.data);

  Creator.fromMap(Map<String, dynamic> map) :
    assert(map.containsKey('creatorId'),
    assert(map.containsKey('name'),
    this ( creatorId: map['creatorId'], name: map['name'] );

  /*

  ...

  */
}

И как я хочу это использовать

return Scaffold(
  appBar: AppBar(title: new Text('Creators')),
  body: StreamBuilder<QuerySnapshot>(
    stream: CreatorRepo.getCreators().map<List<Creator>>((creators) {
      return creators.documents.map<Creator>((c) => Creator.fromSnapshot(c)).toList();
    }),
    builder: (BuildContext context, snapshot) {
      if ( snapshot.hasData ) {
        return ListView.builder(
          itemCount: snapshot.data.length,
          builder: (context, index) {
            final creator = snapshot.data[index];

            return ExpansionTile(
              title: Text(creator.name),
              children: [
                Text(creator.creatorId),
              ],
            );
          },
        );
      }

      return const CircularProgressIndicator();
    },
  ),
);

Зависимость:

dependencies:
  flutter:
    sdk: flutter

  cloud_firestore: ^0.6.3
  firebase_messaging: ^0.2.4

Firestore допускает только ключи String и значения dynamic, за исключением Timestamp, основных типов языков. Плагин cloud_firestore хранит данные документа в _InternalLinkedHashMap<dynamic, dynamic>. Я думал, что Map внутри всех DocumentSnapshot будет Map<String, dynamic>. Как я могу обойти это? Изменение всех функций на Map<dynamic, dynamic> и предположении, что ключом является String, является довольно уродливым решением проблемы.

Ответы [ 3 ]

0 голосов
/ 10 июля 2018

Флаттер теперь работает с Map<String,String>

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

Используйте Map<String, dynamic>.from ( mapFromFirestore ). Предполагается, что значения в mapFromFirestrore являются String ключами к dynamic значениям.

0 голосов
/ 16 мая 2018

Я полагаю, это потому, что карта, возвращенная из Firebase, не является Map<String, dynamic>, а вместо этого Map<dynamic, dynamic>.

См. https://github.com/flutter/flutter/issues/17417 для связанной проблемы.

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