Ошибка трепетания: тип 'Future <dynamic>' не является подтипом типа 'List <Game>' - PullRequest
0 голосов
/ 08 апреля 2019

Я пытаюсь создать приложение с различными списками игр.В качестве бэкэнда я использую Firebase, и соединение работает нормально, я проверил его.В любом случае, у меня проблемы с заменой фиктивных данных реальными данными из firebase.Я всегда получаю эту ошибку:

тип 'Future ' не является подтипом типа 'List '

У меня есть следующая функция:

getGames() async{
 List newGamesList = [];

  QuerySnapshot result = awaitFirestore.instance.collection('products').getDocuments();
  List<DocumentSnapshot> documents = result.documents;
  documents.forEach((DocumentSnapshot doc) {
  Game game = new Game.fromDocument(doc);
  newGamesList.add(game);

});
}

«Игра» выглядит так:

factory Game.fromDocument(DocumentSnapshot document) {

return new Game(
  name: document['name'],
  box: document['box'],
  cover: document['cover'],
  description: document['description'],

);
}

В моем виджете сборки я называю «getGames»:

new HorizontalGameController(getGames()),

Любая идея, почему возникает эта ошибка и какрешить это?

РЕДАКТИРОВАТЬ:

Для лучшего понимания вот мой HorizontalGameController:

class HorizontalGameController extends StatelessWidget {
HorizontalGameController(this.gameItems);
final List<Game> gameItems;

@override
Widget build(BuildContext context) {
return new SizedBox.fromSize(
  size: const Size.fromHeight(240.0),
  child: new ListView.builder(
      itemCount: 1,
      scrollDirection: Axis.horizontal,
      padding: const EdgeInsets.only(left: 12.0, top: 4.0),
      itemBuilder: (BuildContext context, int position) {
        return GameContainerItem(context, gameItems[position]);
      }),
);
}
}

1 Ответ

1 голос
/ 08 апреля 2019

getGames не возвращает созданный вами список игр.Сделайте так, чтобы функция возвращала список игр.Я не могу проверить это, но попробуйте

Future<List<Game>> getGames() async{
 List<Game> newGamesList = [];

  QuerySnapshot result = await Firestore.instance.collection('products').getDocuments();
  List<DocumentSnapshot> documents = result.documents;
  documents.forEach((DocumentSnapshot doc) {
  Game game = new Game.fromDocument(doc);
  newGamesList.add(game);

});

return newGamesList;
}

//then this
//new HorizontalGameController(await getGames()) //change this 

РЕДАКТИРОВАТЬ Измените new HorizontalGameController(await getGames()) на приведенный ниже код (оберните его с помощью futureBuilder).Это позволит виджету использовать будущее значение.

FutureBuilder<List<Game>>(
                            future: getGames(),
                            builder: (context, AsyncSnapshot<List<Game>> gamelistSnapshot){
                                  return (gamelistSnapshot.hasData)? HorizontalGameController(gamelistSnapshot.data) : Container();
                            },
                        )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...