flutter - 使用 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):尝试调用:
我无法找出我在代码中哪里犯了错误。
解决方案
下有多个子节点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']);
...
推荐阅读
- ansible - 如何在 ansible playbook 中使用修剪和 if 条件?
- java - 导出创建新文件的应用程序的可运行 JAR
- r - 有没有办法从 ASC 文件中逐行读取并在特定子字符串后检查它?
- linux-kernel - 如何调试 MDIO 总线扫描失败?
- vue.js - 如何在 Vue.js 中访问嵌套数组中的数据?
- python - audioread.exceptions.NoBackendError Midi 文件
- python - 为什么环境收集器和 doctree-resolved 之间的节点实例不同?
- ios - 在将相机从二维码移开之前不会播放音频 - iOS
- php - Codeigniter:添加 order_by 查询时排序不工作
- c - 当流是标准输入时,函数 getw() 如何工作?