Читать список элементов из базы данных firebase flutter - PullRequest
0 голосов
/ 12 июля 2020

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

введите описание изображения здесь

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

_TypeError (type 'List<dynamic>' is not a subtype of type 'List<DataSnapshot>')

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

import 'package:firebase_database/firebase_database.dart';
final DatabaseReference _refdata =
    FirebaseDatabase.instance.reference().child('host');

getItems() async {
  String _refOnline;
  await _refdata.child("ref").once().then((value) => _refOnline = value.value);
  if (dataRef != _refOnline) {
    await _refdata.child("values/valores").once().then((DataSnapshot snap2) {
  List<DataSnapshot> result = snap2.value;
  lista = result
      .map((element) => Item(
          element.key,
          element.value["nome"],
          element.value["preco"].toDouble(),
          element.value["precoantes"] ?? "",
          element.value["tipo"],
          element.value["disponivel"],
          element.value["descricao"],
          element.value["calorias"]))
      .toList();
});

редактировать :

с этим изменением я могу вернуть значения:

List<Map<dynamic, dynamic>> result =
          List<Map<dynamic, dynamic>>.from(snap2.value);
      result.forEach((element) {
        if (element != null) {
          print(element);
        }
      });

, но я не могу вернуть ключи (1,2,3,4,5)

, и это то же самое, что и это (запрос, упорядоченный по ключам):

List<dynamic> result = snap2.value;
      int _i = 1;
      result.forEach((value) {
        if (value != null) {
          lista.add(Item(
              _i.toString(),
              value["nome"],
              value["preco"].toDouble(),
              value["precoantes"] ?? "",
              value["tipo"],
              value["disponivel"],
              value["descricao"],
              value["calorias"]));
          _i += 1;
          print(value["nome"]);
          print(value);
          print(lista.length);
        }

, и теперь я получаю эту ошибку :

NoSuchMethodError (NoSuchMethodError: The method 'add' was called on null.
Receiver: null
Tried calling: add(Instance of 'Item'))

Ответы [ 2 ]

0 голосов
/ 13 июля 2020

Мне удалось решить эту проблему с помощью этой реализации:

getItems() async {
  String _refOnline;
  List<dynamic> result;
  await _refdata.child("ref").once().then((value) => _refOnline = value.value);
  if (dataRef != _refOnline) {
    await _refdata.child("values/valores").once().then((DataSnapshot snap2) {
      result = snap2.value;
      int _i = 1;
      result.forEach((value) {
        if (value != null) {
          Item _a = Item(
              _i.toString(),
              value["nome"],
              value["preco"].toDouble(),
              value["precoantes"] ?? "",
              value["tipo"],
              value["disponivel"],
              value["descricao"],
              value["calorias"]);
          lista.add(_a);
          _i += 1;
        }
      });
      savepref("ref_key", _refOnline);
    });
  } else {
    lista = [oi, oi2, oi3, oi4, oi5, oi6, oi7, oi8, oi9, oi10, oi11, oi12];
    //readIt();
  }
} 

возникла проблема с определением списка, блокирующим его получение новых элементов в функции lista.add. Теперь мы определили lista как:

List<Item> lista = [];

И с вышеуказанной функцией теперь все работает.

THX Frank van Puffelen!

0 голосов
/ 12 июля 2020

Во FlutterFire нет способа получить дочерние узлы в виде списка DataSnapshot объектов.

Ближайшее, что я получил, было:

currentRoundListener = dbRoot.child('rounds/$currentRoundKey').once.then((snapshot) {
  currentRound = List<String>.from(snapshot.value as List<dynamic>);
});

Вы можете попробовать с:

List<DataSnapshot> result = List<DataSnashot>.from(snap2.value as List<dynamic>);

Но более вероятно, что значения под снимком будут доступны только в виде карты:

Map<String, dynamic> result = Map<String, dynamic>.from(snap2.value as Map<dynamic, dynamic>);

Если вам нужно поддерживать порядок дочерних узлов, посмотрите здесь: Flutter: Firebase Real-Time database orderByChild не влияет на результат запроса и здесь: Ошибка базы данных Flutter Firebase порядок отметки времени

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