【问题标题】:Problem while response from firebase realtime databse in FlutterFlutter中firebase实时数据库响应时出现问题
【发布时间】:2020-04-05 01:38:21
【问题描述】:

我想从实时数据库中获取数据,数据的形式是 地图 > 问题来了

 const  url='https://XYZfirebaseio.com/products.json';
  try{
   final resp= await http.get(url);
   print(json.decode(resp.body));
   final extractedData=json.decode(resp.body) as Map<String,dynamic>;

   final List<Product>loadedProducts=[];
   extractedData.forEach((id,data){
     loadedProducts.add(
       Product(
         id: data,
         title: data['title'],
         description: data['descripiton'],
         price:data['price'],
         imageUrl: data['imageUrl'],
         isFavorite: data['imageUrl']
       )
     );
   });

虽然 Product 类只是一个普通类,并且 PRICE 属性为 Double,但其他所有属性都是 String。执行此代码时会产生以下错误。

I/flutter (4228):“_InternalLinkedHashMap”类型不是“String”类型的子类型

我可以使用什么数据结构/方法/解决方法?

产品类

import 'package:flutter/foundation.dart';
class Product with ChangeNotifier{
  final String id;
  final String title;
  final String description;
  final double price;
  final String imageUrl;
  bool isFavorite;

  Product(
    {
      @required this.id,
      @required this.title,
      @required this.description,
      @required this.price,
       this.isFavorite = false,
     @required this.imageUrl
    }
  );

【问题讨论】:

  • 你要检索的数据怎么可能是Map&lt;String, Map&lt;String, String&gt;&gt;的形式?,Firebase数据库总是返回数据为Map&lt;String, dynamic&gt;,你能分享你的产品类吗?
  • 是的,你是绝对正确的..但我的意思是我得到的确切数据..我只是简单地描述了更多????.但问题是一样的......它返回你提到的类型...但是..dart 不认识它。
  • 将您的产品类别添加到您的问题中,以便我能够检查所有内容
  • 你可以看到代码的第5行....这行导致提到的错误.????
  • 在这种情况下,flutter 抱怨接收到一个简单的字符串,而您期望得到一个 Map&lt;String, dynamic&gt;

标签: android firebase flutter firebase-realtime-database dart


【解决方案1】:

问题确实出在你的 forEach 循环中,forEach 接受一个带两个参数的函数,一个带键(你称之为“id”),另一个带值(你称之为“数据”),问题是您在 Product 类上的 id 参数,因为它是一个字符串,但您正在为它分配一个 Map 值。

如果你检查你的json结果你得到I/flutter ( 4307): {-LvsecaYtE8jB81j6USh: {description: DummyTitle, imageUrl: https.dummmyd.jpg, isFavourite: false, title: DummyTitle}},所以forEach循环只会迭代一次,键是-LvsecaYtE8jB81j6USh(你的“id”),值是{description: DummyTitle, imageUrl: https.dummmyd.jpg, isFavourite: false, title: DummyTitle}(你的"data"),所以你可以看到,你分配错了。

正确的做法是:

extractedData.forEach((id,data) {
     loadedProducts.add(
       Product(
         id: id,
         title: data['title'],
         description: data['descripiton'],
         price:data['price'],
         imageUrl: data['imageUrl'],
         isFavorite: data['imageUrl']
       )
     );
   });

这是,假设值“-LvsecaYtE8jB81j6USh”是你想要的真实ID。

【讨论】:

    猜你喜欢
    • 2021-07-01
    • 2021-04-09
    • 2021-04-22
    • 2020-08-13
    • 1970-01-01
    • 1970-01-01
    • 2023-01-27
    • 2022-08-05
    • 1970-01-01
    相关资源
    最近更新 更多