首页 > 解决方案 > 使用 Flutter 在 null.Realtime Database 上调用了方法“[]”

问题描述

我将数据实时插入firebase的方式:

在此处输入图像描述

执行此操作的代码:

 void SaveRideRequest() {
    rideRequestReference = FirebaseDatabase.instance.reference().child("Ride Requests").push();

    var pickUp = Provider
        .of<AppData>(context, listen: false)
        .pickUpLoacation;
    var dropOff = Provider
        .of<AppData>(context, listen: false)
        .dropOffLocation;

    Map pickUpLocationMap = {

      "latitude": pickUp.latitude.toString(),
      "longitude": pickUp.longitude.toString(),

    };

    Map dropOffUpLocationMap = {

      "latitude": dropOff.latitude.toString(),
      "longitude": dropOff.longitude.toString(),

    };

    Map riderInfoMap = {
      "driver_id:": "Waiting",
      "payment_method": "cash",
      "pickup": pickUpLocationMap,
      "dropOff": dropOffUpLocationMap,
      "created at": DateTime.now().toString(),
      "rider_name ": userCurrentInfo.name,
      "rider_phone ": userCurrentInfo.phone,
      "pickup_address": pickUp.placeName,
      "dropOff_address": dropOff.placeName,


    };

    rideRequestReference.set(riderInfoMap);
  }

我正在尝试使用以下代码从 firebase 实时检索数据。

DatabaseReference newRequestRef=FirebaseDatabase.instance.reference().child("Ride Requests");

无效retrieveRideRequestInfo(字符串rideRequestId){

newRequestRef.child(rideRequestId).once().then((DataSnapshot dataSnapShot) {

        double pickUpLocationLat=double.parse(dataSnapShot.value['pickup']['latitude']);
        double pickUpLocationLng=double.parse(dataSnapShot.value['pickup']['longitude']);
        String pickUpAddress=dataSnapShot.value['pickup_address'].toString();

        double dropOffLocationLat=double.parse(dataSnapShot.value['dropOff']['latitude:']);
        double dropOffLocationLng=double.parse(dataSnapShot.value['dropOff']['longitude']);
        String dropOffAddress=dataSnapShot.value['dropOff_address'].toString();

        String paymentMethod=dataSnapShot.value['payment_method'].toString();


        RideDetails rideDetails=RideDetails();

        rideDetails.ride_request_id=rideRequestId;
        rideDetails.pickup_address=pickUpAddress;
        rideDetails.pickup_address=dropOffAddress;
        rideDetails.pickup=LatLng(pickUpLocationLat, pickUpLocationLng);
        rideDetails.dropOff=LatLng(dropOffLocationLat,dropOffLocationLng);

        rideDetails.payment_method=paymentMethod;


        print("Information::");
        print(rideDetails.pickup_address);
        print(rideDetails.dropOff_address);    
    });
  }
}

但是,我收到以下错误:

E/flutter(8701):[错误:flutter/lib/ui/ui_dart_state.cc(186)]未处理的异常:NoSuchMethodError:方法'[]'在null上调用。

E/颤振(8701):接收器:空

E/颤振(8701):尝试调用:

我无法找出我在代码中哪里犯了错误。

标签: flutterfirebase-realtime-database

解决方案


下有多个子节点Ride Requests。因此,当您使用 时newRequestRef.child(rideRequestId).once(),您dataSnapShot包含所有这些信息。

当你访问dataSnapShot.value['pickup']时,没有节点Ride Requests/pickup,所以它返回null。因此,当您然后 to 时dataSnapShot.value['pickup']['latitude'],您调用['latitude']的是 null,这就是错误消息所说的内容。

要解决此问题,您需要访问Ride Requests. 这个使用非常棘手(参见[这里]),但现在这个功能请求已经实现,你应该能够循环遍历dataSnapshot.value.values.

所以像:

dataSnapshot.value.values.forEach((snapshot) => {
    double pickUpLocationLat=double.parse(snapshot.value['pickup']['latitude']);
    double pickUpLocationLng=double.parse(snapshot.value['pickup']['longitude']);
    ...

推荐阅读