dart 什么可以解决“The method '[]' can't be unconditional invoked because the receiver can be null”错误而不改变核心功能?

nbysray5  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(90)

从一个老项目中学习。精确地从真实的时间数据库中检索细节。问题描述是“方法'[]'不能无条件调用,因为接收器可以为null”。
从Firebase的真实的时间数据库中检索细节是我的期望。然而,我学习的代码似乎有点过时了。
这是代码的一部分:

Future<void> retrieveRideRequestInfo(String rideRequestId, BuildContext context) async {

  try {
    DatabaseReference newRequestsRef = FirebaseDatabase.instance.reference().child("Ride Requests");
    DatabaseEvent databaseEvent = await newRequestsRef.child(rideRequestId).once();
    final data = databaseEvent.snapshot.value as Map<String, dynamic>;

    if (databaseEvent.snapshot.value != null) {

      assetsAudioPlayer.open(Audio("sounds/alert.mp3"));
      assetsAudioPlayer.play();
      RideRequest rideRequest = RideRequest(data);
      double pickUpLocationLat = double.parse(databaseEvent.snapshot.value['pickup']['latitude'].toString());
      double pickUpLocationLng = double.parse(databaseEvent.snapshot.value['pickup']['longitude'].toString());
      String? pickUpAddress = double.parse(databaseEvent.snapshot.value['pickup_address'].toString());
      double? dropOffLocationLat = double.parse(databaseEvent.snapshot.value['dropoff']['latitude'].toString());
      double? dropOffLocationLng = double.parse(databaseEvent.snapshot.value['dropoff']['longitude'].toString());
      String dropOffAddress = double.parse(databaseEvent.snapshot.value['dropoff_address'].toString());
      String? paymentMethod = double.parse(databaseEvent.snapshot.value['payment_method'].toString());

字符串

5jvtdoz2

5jvtdoz21#

问题就在这里:

if (databaseEvent.snapshot.value != null) {

  assetsAudioPlayer.open(Audio("sounds/alert.mp3"));
  assetsAudioPlayer.play();
  RideRequest rideRequest = RideRequest(data);
  double pickUpLocationLat = double.parse(databaseEvent.snapshot.value['pickup']['latitude'].toString());

字符串
在你检查databaseEvent.snapshot.value != null是否正确和你在double.parse(databaseEvent.snapshot.value['pickup']['latitude'].toString())中使用它的那一刻之间,databaseEvent.snapshot.value可能会改变值(想想多线程或事件驱动代码)。所以检查并不能帮助防止以后的错误。
最简单的修复方法是将值分配给局部变量并对其执行所有操作:

...
final data = databaseEvent.snapshot.value as Map<String, dynamic>;
final value = databaseEvent.snapshot.value;

if (value != null) {
  assetsAudioPlayer.open(Audio("sounds/alert.mp3"));
  assetsAudioPlayer.play();
  RideRequest rideRequest = RideRequest(data);
  double pickUpLocationLat = double.parse(value['pickup']['latitude'].toString());
  ...


检查后value突然变为null的风险现在已经消失了,因为它是一个局部变量。

相关问题