当前位置: 首页 > 知识库问答 >
问题:

颤振:无法从模型中提取数据到列表

苗阳
2023-03-14

我在模型类中遇到问题,无法将数据从实时firebase数据库提取到列表中,但接收到空值。通过以下图片进一步澄清:

这是要获取数据的图像。

这是一个模型类:

class Seller {
  var key;

  String address,
      businessType,
      description,
      fcm,
      joinTimeStamp,
      name,
      onlineStatus,
      picUrl,
      uuid;
  int blockByAdmin, completeOrders, rating;
  double lat;
  double lng;

  Seller(
      this.address,
      this.blockByAdmin,
      this.businessType,
      this.description,
      this.completeOrders,
      this.fcm,
      this.joinTimeStamp,
      this.lat,
      this.lng,
      this.name,
      this.onlineStatus,
      this.picUrl,
      this.rating,
      this.uuid);

  Seller.fromSnapshot(DataSnapshot snapshot)
      : key = snapshot.value,
        address = snapshot.value["address"],
        blockByAdmin = snapshot.value["blockByAdmin"],
        businessType = snapshot.value["businessType"],
        description = snapshot.value["description"],
        completeOrders = snapshot.value["completeOrders"],
        fcm = snapshot.value["fcm"],
        joinTimeStamp = snapshot.value["joinTimeStamp"],
        lat = snapshot.value["lat"],
        lng = snapshot.value["lng"],
        name = snapshot.value["name"],
        onlineStatus = snapshot.value["onlineStatus"],
        picUrl = snapshot.value["picUrl"],
        rating = snapshot.value["rating"],
        uuid = snapshot.value["uuid"];

  toJson() {
    return {
      'address': address,
      'blockByAdmin': blockByAdmin,
      'businessType': businessType,
      'description': description,
      'completeOrders': completeOrders,
      'fcm': fcm,
      'joinTimeStamp': joinTimeStamp,
      'lat': lat,
      'lng': lng,
      'name': name,
      'onlineStatus': onlineStatus,
      'picUrl': picUrl,
      'rating': rating,
      'uuid': uuid,
    };
  }
}

这是一个我们正在使用model类并在列表长度处获取null的类:

 class Body extends StatefulWidget {
    
      @override
      _BodyState createState() => _BodyState();
    }
    
    class _BodyState extends State<Body> {
      final urlImage =
          'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSPlqk-tNmFTjT7q_edAjaYLU5qf2cFUM9vfrweUbqnS_58LqF7AMp67KVdslIubuzy9b4&usqp=CAU';
      final _database = FirebaseDatabase.instance.reference().child('kjobhee');
      List<Seller> _sellerList;
      StreamSubscription<Event> _onTodoAddedSubscription;
      Query _query;
    
      @override
      void initState() {
        super.initState();
       
        _activateListeners();
      }
   
      void _activateListeners() {
        _query = _database.child('seller');
        _onTodoAddedSubscription = _query.onValue.listen(onEntryAdded);
      }
    
      onEntryAdded(Event event) {
        setState(() {
          _sellerList.add(Seller.fromSnapshot(event.snapshot));
          print(_sellerList);
        });
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            backgroundColor: kPrimaryColor,
          ),
          drawer: NavigationDrawer(),
          body: RefreshIndicator(
            onRefresh: () => _buildBuyerProfile(),
            child: _sellerList.length > 0
                ? ListView.builder(
                    shrinkWrap: true,
                    itemCount: _sellerList.length,
                    itemBuilder: (BuildContext context, int index) {
                      String key = _sellerList[index].key;
                      String address = _sellerList[index].address;
                      int blockByAdmin = _sellerList[index].blockByAdmin;
                      String businessType = _sellerList[index].businessType;
                      String description = _sellerList[index].description;
                      int completeOrders = _sellerList[index].completeOrders;
                      String fcm = _sellerList[index].fcm;
                      String joinTimeStamp = _sellerList[index].joinTimeStamp;
                      double lat = _sellerList[index].lat;
                      double lng = _sellerList[index].lng;
                      String name = _sellerList[index].name;
                      String onlineStatus = _sellerList[index].onlineStatus;
                      String picUrl = _sellerList[index].picUrl;
                      int rating = _sellerList[index].rating;
                      String uuid = _sellerList[index].uuid;
                      print(key +
                          '/' +
                          address +
                          '/' +
                          blockByAdmin.toString() +
                          '/' +
                          businessType +
                          '/' +
                          description +
                          '/' +
                          completeOrders.toString() +
                          '/' +
                          fcm +
                          '/' +
                          joinTimeStamp +
                          '/' +
                          lat.toString() +
                          '/' +
                          lng.toString() +
                          '/' +
                          name +
                          '/' +
                          onlineStatus +
                          '/' +
                          picUrl +
                          '/' +
                          rating.toString() +
                          '/' +
                          uuid);
                      return _buildBuyerProfile();
                    })
                : Center(
                    child: CircularProgressIndicator(),
                  ),
          ),
        );
      }

我将非常感谢任何用户帮助。

共有1个答案

华星驰
2023-03-14

你需要考虑以下几点:

>

  • 您需要确保从Firebase获取数据,尝试在日志中打印数据,并检查是否收到数据。

    你需要管理你的用户界面,考虑到当屏幕首次加载时,你的数据将不在那里,这意味着你的变量_sellerList将为空。所以你需要检查你的代码中缺少的部分。

    如果您没有从firebase获取数据,但我认为配置已正确完成,那么您可以使用与我使用的代码相同的代码获取数据:

    Future<void> fetchProducts() async {
    await FirebaseFirestore.instance
        .collection(FirebaseCollectionConst.productsCollection)
        .get()
        .then((QuerySnapshot productsData) {
      _products = [];
          productsData.docs.forEach((element) {
            _products.insert(0, Product(
                id: element.get('productId'),
                title: element.get('productTitle'),
                description: element.get('productDescription'),
                price: double.parse(element.get('price')),
                imageUrl: element.get('productImage'),
                brand: element.get('productBrand'),
                productCategoryName: element.get('productCategory'),
                quantity: int.parse(element.get('productQuality')),
                isFavourite: false,
                isPopular: true));
          });
    });
    

    }

    在这里,我获取一个产品集合,并收集到一个类成员中,该类成员扩展了ChangeNotifier类,并在提供者的帮助下显示该数据。

  •  类似资料:
    • 假设我有一个字符串: 现在我需要从两个字符串中解析23。如何从字符串值中提取该数字或任何数字?

    • 我正在使用firebase云功能向特定用户发送通知。这是我从函数发送的有效负载。 我正在使用firebase_messaging(flutter package:https://pub.dartlang.org/packages/firebase_messaging)接收通知,并且我已经编写了onMessage、onLaunch和onResume方法的代码。 因此,当我使用Admin SDK发送消

    • 参数类型“List”不能分配给参数类型“Widget?函数(BuildContext, int)”。 缺少选择器,如“”。标识符“”或“[0]”。 参数类型“库比蒂诺列表”不能分配给参数类型“动态函数(动态)”。 未定义的名称“e”。 未定义的类's'。 应找到“;”。 我正在克服错误。如何解决这个问题 选择\u county。飞奔 国家代码。json

    • 这是我得到的错误,我不知道如何解决它 无法将参数类型“List”分配给参数类型“List”。 提前感谢帮助解决 解决方案:盲我找到解决方案:类型列表

    • 我读过https://flutter.dev/docs/development/ui/assets-and-images#asset-包依赖项中的图像和从资产中读取的文本文件,并应用了所有这些,但我的代码仍然无法工作。。。。 我为此打开了一个新项目,在主文件夹中创建了资产和文件: 然后,不信任Android Studio,我检查了vi,在pubspec.yaml一切都好: 该文件以以下内容结尾:

    • Xcode的输出:在文件中包含从 /Users/dani/development/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.0.3/ios/Classes/FLTURLLauncherPlugin.m: 7: /Users/dani/development/flutter/.pub-cache/hosted/pub.dart