【问题标题】:Unhandled Exception: type 'String' is not a subtype of type 'double' even if a double is given未处理的异常:即使给出了双精度类型,“字符串”类型也不是“双精度”类型的子类型
【发布时间】:2019-10-08 17:31:06
【问题描述】:

我正在从 Firestore 中获取坐标,以便在我的地图中填充商店位置。 Google Map Marker 需要一个带有点的纬度和经度的 LatLng 对象(以两个 double 作为参数)。但是,对于每个增量,我都会收到以下异常:type 'String' is not a subtype of type 'double'(下面详细说明)。

但是,这些点确实出现在地图上,这应该意味着值是 double 类型...

我用下面的代码来识别经纬度类型:

if (store['latitude'] is double) {
  print('double!');
} else if (store['latitude'] is String) {
  print('string!');
}
print('');
if (store['longitude'] is double) {
  print('double!');
} else if (store['longitude'] is String) {
  print('string!');
}
print('');

上面写着“双倍!”每次。

代码如下:

Firestore.instance
        .collection('points-of-sale')
        .snapshots()
        .listen((data) => data.documents.forEach((store) {
              LatLng pos = LatLng(
                 store['latitude'], // Here
                 store['longitude'] // and here
              );
              /* Adding a marker to the map */
            }));

这是完整的错误:

[VERBOSE-2:ui_dart_state.cc(148)] Unhandled Exception: type 'String' is not a subtype of type 'double'
#0      _StoreLocatorState._addMarker (package:leonor_greyl_app_2019_41820/pages/StoreLocatorWidget.dart:21:30)
#1      _StoreLocatorState.build.<anonymous closure>.<anonymous closure> (package:leonor_greyl_app_2019_41820/pages/StoreLocatorWidget.dart:48:15)
#2      List.forEach (dart:core-patch/growable_array.dart:278:8)
#3      _StoreLocatorState.build.<anonymous closure> (package:leonor_greyl_app_2019_41820/pages/StoreLocatorWidget.dart:47:42)
#4      _rootRunUnary (dart:async/zone.dart:1132:38)
#5      _CustomZone.runUnary (dart:async/zone.dart:1029:19)
#6      _CustomZone.runUnaryGuarded (dart:async/zone.dart:931:7)
#7      _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:336:11)
#8      _DelayedData.perform (dart:async/stream_impl.dart:591:14)
#9      _StreamImplEvents.handleNext (dart:async/stream_impl.dart:707:11)
#10     _PendingEvents.schedule.<anonymous closure> (dart:a<…>

编辑: 这是parseDouble(store['latitude']) 的完整详细输出:

[VERBOSE-2:ui_dart_state.cc(148)] Unhandled Exception: FormatException: Invalid double
x
#0      double.parse (dart:core-patch/double_patch.dart:110:28)
#1      _StoreLocatorState._addMarker (package:leonor_greyl_app_2019_41820/pages/StoreLocatorWidget.dart:22:66)
#2      _StoreLocatorState.build.<anonymous closure>.<anonymous closure> (package:leonor_greyl_app_2019_41820/pages/StoreLocatorWidget.dart:51:15)
#3      List.forEach (dart:core-patch/growable_array.dart:278:8)
#4      _StoreLocatorState.build.<anonymous closure> (package:leonor_greyl_app_2019_41820/pages/StoreLocatorWidget.dart:50:42)
#5      _rootRunUnary (dart:async/zone.dart:1132:38)
#6      _CustomZone.runUnary (dart:async/zone.dart:1029:19)
#7      _CustomZone.runUnaryGuarded (dart:async/zone.dart:931:7)
#8      _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:336:11)
#9      _DelayedData.perform (dart:async/stream_impl.dart:591:14)
#10     _StreamImplEvents.handleNext (dart:async/stream_impl.dart:707:11)
#11     _<…>

【问题讨论】:

    标签: dart flutter google-cloud-firestore


    【解决方案1】:

    如果提供的Object 无法解析为double,则使用返回null 的parseDouble 函数。然后,您可以在创建标记之前检查经度和纬度的值是否为空。

      Firestore.instance
          .collection('points-of-sale')
          .snapshots()
          .listen((data) => data.documents.forEach((store) {
                double latitude = parseDouble(store['latitude']);
                double longitude = parseDouble(store['longitude']);
    
                    // Check if parser returns null for non-parsable string
                if (latitude != null && longitude != null) {
                  LatLng pos = LatLng(latitude, longitude);
                  /* Adding a marker to the map */
                }
              }));
    

    解析函数

    double parseDouble(dynamic value) {
      try {
        if (value is String) {
          return double.parse(value);
        } else if (value is double) {
          return value;
        } else {
          return 0.0;
        }
      } catch (e) {
        // return null if double.parse fails
        return null;
      }
    }
    

    【讨论】:

    • 这会引发一个新异常:Unhandled Exception: FormatException: Invalid double
    • 你能打印出 store['latitude'] 值吗
    • 这是输出:flutter: 44.843034
    • 该异常仅在无法解析馈送数据时发生。异常中的打印应该告诉我们数据格式
    • Invalid double x 行表示您的 store['latitude'] 值之一有一个包含 x 的字符串,dart 无法解析为双精度值。检查您的数据源或在异常后的返回值中使用默认值。
    猜你喜欢
    • 2021-06-20
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    • 2021-04-28
    • 2016-03-28
    • 1970-01-01
    • 2016-10-19
    • 1970-01-01
    相关资源
    最近更新 更多