【问题标题】:Flutter Realtime Database Map not workingFlutter 实时数据库映射不起作用
【发布时间】:2022-02-19 00:04:53
【问题描述】:

我正在尝试列出一个实时数据库。 我有数据映射方式的问题,但我不明白如何解决。

我的代码是:

Future<List<ProductoLeido>> getProductosEnGia() async {
  List<ProductoLeido> prdEnGia = [];

  try {
    DatabaseEvent event =
        await FirebaseDatabase.instance.ref().child('ProductosEnGIA').once();

    if (event.snapshot.exists) {
      DataSnapshot s = event.snapshot;
      print("out forEach");
      Map<String, Object?>.from(s.value as dynamic).forEach((key, value) => {
            print('key:' + key),
            print("in forEach"),
          });
    }

    return prdEnGia;

  } catch (e) {

    return prdEnGia;

  }
}

而返回的是:

TypeErrorImpl(应为 'Map' 类型的值,但得到了 'List' 类型之一)

我正在附加图像以在调试模式下共享更多数据。

【问题讨论】:

    标签: flutter firebase-realtime-database


    【解决方案1】:

    您正在读取的数据似乎具有顺序的数字键,这意味着 Firebase SDK 将其映射到数组/列表而不是映射。

    所以而不是:

    Map<String, Object?>.from(s.value as dynamic)
    

    你会想要使用:

    List<Object?>.from(s.value as dynamic)
    

    我建议阅读这篇博文以了解有关 Firebase 如何处理数组的更多信息:Best Practices: Arrays in Firebase

    【讨论】:

      【解决方案2】:

      完成。我解决问题。 这就是解决方案:

       Future<List<ProductoLeido>> getProductosEnGia() async {
      List<ProductoLeido> prdEnGia = [];
      
      try {
        DatabaseEvent event =
            await FirebaseDatabase.instance.ref().child('ProductosEnGIA').once();
      
        if (event.snapshot.exists) {
          DataSnapshot s = event.snapshot;
          final m = s.value as List<dynamic>;
          for (int i = 0; i < m.length; i++) {
            final p = ProductoLeido.fromJson(m[i]);
            print(m[i].toString());
            Map<dynamic, dynamic> d = m[i];
            ProductoLeido.fromJson(d);
            var cod = ProductoLeido.fromJson(d).codigo;
            var cant = ProductoLeido.fromJson(d).cantidad;
            print('CODIGO>>>>' + cod.toString());
            ProductoLeido prL = ProductoLeido(cod, cant);
            prdEnGia.add(prL);
          }
        }
      
        return prdEnGia;
      } catch (e) {
        return prdEnGia;
      }
      

      }

      【讨论】:

      • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-02
      • 2021-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-27
      • 2021-05-10
      相关资源
      最近更新 更多