参数类型“double?”无法分配给参数类型“double”。Dart(argument_type_not_assignable)

6
我正在尝试获取用户当前位置,但在l.latitude和l.longitude处出现了错误。 参数类型“double?”无法分配给参数类型“double”。
void _onMapCreated(GoogleMapController _cntlr) {
    _controller = _cntlr;
    _location.onLocationChanged.listen((l) {
      _controller.animateCamera(
        CameraUpdate.newCameraPosition(
          CameraPosition(
            target: LatLng(l.latitude, l.longitude),
            zoom: 15,
          ),
        ),
      );
    });
  }

3个回答

20

您收到的错误来自空安全机制,类型double?表示它既可以是double,也可以是null,但是您的参数只接受double而不接受null

为此,您可以通过在变量末尾添加!来“强制”使用“非空”变量,但是在执行此操作时要小心。

CameraPosition(
    target: LatLng(l.latitude!, l.longitude!),
    zoom: 15,
)

您可以在官方文档中了解有关空安全语法和原则的更多信息:https://flutter.dev/docs/null-safety


1
你还可以对本地变量进行空值检查,从而使你的代码具有空值安全性:
    when location changes
      if (lat/lon are not null) {
        animate camera
      }

这样的东西可能会起作用:

所以像这样:

  void _onMapCreated(GoogleMapController _cntlr) {
    _controller = _cntlr;
    _location.onLocationChanged.listen((l) {
      if (l.latitude != null && l.longitude != null) {
        _controller.animateCamera(
          CameraUpdate.newCameraPosition(
            CameraPosition(
              target: LatLng(l.latitude, l.longitude),
              zoom: 15,
            ),
          ),
        );
      }
    });
  }

从逻辑上讲,将经度/纬度动画化为null是没有意义的,因此如果是这种情况,您可以完全跳过该侦听器调用。

Filip在这里谈论了这种情况和处理方法


1
以上解决方案对我无效,如果对您也无效,则问题可能是因为您尝试访问的两个变量都必须进行空值检查,所以请改用以下方法:
CameraPosition(
target: LatLng(l!.latitude!, l!.longitude!),
zoom: 15,

) 只需在 l 前面加上 !,并在纬度或经度前再加一个 !,这将完美修复代码


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接