断言失败:'纬度!= null':不正确。我已经尝试了几件事

Posted

技术标签:

【中文标题】断言失败:\'纬度!= null\':不正确。我已经尝试了几件事【英文标题】:Failed assertion: 'latitude != null': is not true. I've tried several things断言失败:'纬度!= null':不正确。我已经尝试了几件事 【发布时间】:2020-11-14 18:23:47 【问题描述】:

错误:

location.dart 断言失败:....'latitude != null': is not true.

显然,答案就在这里: Flutter - Google Maps doesn´t wait to Location

但是,这些都对我不起作用。

尝试:

当 lat 和 lng 为空时显示一个空的 Container()...

我不知道这到底是什么... ==??喜欢python?

纬度 == 空 || lng == 空 ?容器()

我的猜测是这个人想让我将 lat 和 lng 分配为 null 并将谷歌地图放入容器中。这里什么都没有:

var lat = null;
var lng = null;

我将我的 sizebox 转换为容器并更改了初始相机位置:

之前:

SizedBox(
          height: 350,
          child: GoogleMap(
            markers: Set.from(markers),
              initialCameraPosition: _myLocation,
              myLocationEnabled: true,
              compassEnabled: true,
              myLocationButtonEnabled: true,
              mapType: MapType.normal,
              onMapCreated: (GoogleMapController controller) 
                controller.setMapStyle(Utils.mapStyles);
              ),

之后:

Container(
          height: 350,
          child: GoogleMap(
            markers: Set.from(markers),
            initialCameraPosition: CameraPosition(
                target: LatLng(lat, lng),
                zoom: 15.0),
              myLocationEnabled: true,
              compassEnabled: true,
              myLocationButtonEnabled: true,
              mapType: MapType.normal,
              onMapCreated: (GoogleMapController controller) 
                controller.setMapStyle(Utils.mapStyles);
              ),
        ),

结果:

断言失败:“纬度!= null”:不正确。

程序现在甚至无法编译。戳了一下,我把目标改成了:target: LatLng(null, null),

同样的错误。什么都没有改变。

“你可以显示一个加载器,直到你得到你的位置”

没用。

这就是我从 Google 表格中调用我的经度和纬度点的方式。我正在尝试在按钮上绘制它们:

  Future<void> _plotCurrent() async 
    Map<double,double> m = (await sheet.values.map.column(3, fromRow:2)).map((key, value)=>
        MapEntry(double.parse(key), double.parse(value)));
    Map<double,double> m2 = (await sheet.values.map.column(4, fromRow:2)).map((key, value)=>
        MapEntry(double.parse(key), double.parse(value)));


    Iterable _markers = Iterable.generate(10, (index) 
      LatLng latLngMarker = LatLng(m["test$index"], m2["test$index"]);
      return Marker(markerId: MarkerId("test$index"),position: latLngMarker);


    );

    setState(() 
      markers = _markers;
    );
  

我已经阅读了一些关于必须将我的 Widget 构建树更改为 Future 类型的内容。但是,我对 Dart 仍然很糟糕。我不知道该怎么做。这能行吗?这是我的小部件的开始:

  @override
  Widget build(BuildContext context) 
    return Scaffold(
      key: _scaffoldKey,
      resizeToAvoidBottomPadding: false,
      appBar: AppBar(
        title: Text(widget.title, style: TextStyle(fontSize: 11)),
        centerTitle: true,
      ),
      body:

      Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.start,
          children: <Widget>[
            Form(
                key: _formKey,
                child: Padding(
                  padding: EdgeInsets.all(16),
                  child: Column(
                    crossAxisAlignment: CrossAxisAlignment.start,
                    children: <Widget>[
                      TextFormField(

请帮忙。谢谢。

编辑:

这毫无意义.. 地理定位器是把这搞砸了还是什么?这是我现在拥有的:

  @override
  initState() 
    super.initState();
    getLocation();
  
  var lng, lat;
  Future getLocation() async 
    Position position = await Geolocator().getCurrentPosition(desiredAccuracy: LocationAccuracy.high);
    setState(() 
      lat = position.latitude;
      lng = position.longitude;
      print(lng);
    );
  




  @override
  Widget build(BuildContext context) 
    if (lat == null || lng == null) 
      return Container();
    
    Container(
      height: 350,
      child: GoogleMap(
          markers: Set.from(markers),
          initialCameraPosition: CameraPosition(
              target: LatLng(lat, lng),
              zoom: 15.0),
          myLocationEnabled: true,
          compassEnabled: true,
          myLocationButtonEnabled: true,
          mapType: MapType.normal,
          onMapCreated: (GoogleMapController controller) 
            controller.setMapStyle(Utils.mapStyles);
          ),
    );
    return Scaffold(
      key: _scaffoldKey,
      resizeToAvoidBottomPadding: false,
      appBar: AppBar(
        title: Text(widget.title, style: TextStyle(fontSize: 11)),
        centerTitle: true,
      ),
      body:

      Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.start,
          children: <Widget>[
            Form(
                key: _formKey,
                child: Padding(

第一个问题是,我的地图不再显示了。我可以打印坐标......所以,我不明白为什么错误仍然显示并且在我按下 plot 后一切都崩溃了。有人吗?

编辑 2:

这可能与我的错误有关:

相关的导致错误的小部件是:MyHomePage file:///C:/Users/xxx/Desktop/xxxxx/xxxx-xxx/lib/main.dart:92:13 什么时候 抛出异常,这是堆栈:

指向这个小部件:

class MyApp extends StatelessWidget 
  @override
  Widget build(BuildContext context) 
    return MaterialApp(
      title: 'xx',
      theme: ThemeData(
        primarySwatch: colorCustom,
        hintColor: Colors.white,
        canvasColor: colorCustom,
        backgroundColor: Colors.red,
      ),
      home: MyHomePage(title: 'xx'),
    );
  

我没有足够的使用 Dart 的经验,不知道主页的标题与我的其他小部件分开有什么问题。这是一件坏事吗?

我将小部件移动到其他地方并应用了容器。我的应用程序不会以 lat == null || 开头lng == null 语句并抛出以下错误:

在构建 GoogleMap(state: _GoogleMapState#81111):未找到方向性小部件。

我认为问题是我加载了太多垃圾。我迷路了。

    void main() => runApp(
          RestartWidget(child: MyApp()),
        );
    
    class RestartWidget extends StatefulWidget 
      RestartWidget(this.child);
    
      final Widget child;
    
      static void restartApp(BuildContext context) 
        context.findAncestorStateOfType<_RestartWidgetState>().restartApp();
      
    
      @override
      _RestartWidgetState createState() => _RestartWidgetState();
    
    
    class _RestartWidgetState extends State<RestartWidget> 
      Key key = UniqueKey();
    
      void restartApp() 
        setState(() 
          key = UniqueKey();
        );
      
    
      @override
      Widget build(BuildContext context) 
        return KeyedSubtree(
          key: key,
          child: widget.child,
        );
      
    



class MyApp extends StatelessWidget 
  @override
  Widget build(BuildContext context) 
    return MaterialApp(
      title: 'xxxxxxx',
      theme: ThemeData(
        primarySwatch: colorCustom,
        hintColor: Colors.white,
        canvasColor: colorCustom,
        backgroundColor: Colors.red,
      ),
      home: MyHomePage(title: 'xxxxxxx'),
    );
  


class MyHomePage extends StatefulWidget 
  MyHomePage(Key key, this.title) : super(key: key);
  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();



class _MyHomePageState extends State<MyHomePage> 
  final _formKey = GlobalKey<FormState>();
  final _scaffoldKey = GlobalKey<ScaffoldState>();


  @override
  Widget build(BuildContext context) 
    return Scaffold(
      key: _scaffoldKey,

等等...我迷失在所有这些小部件中。有些东西导致我的位置为空。我不知道。有人吗?

【问题讨论】:

【参考方案1】:

在处理异步数据加载时,您需要有一个占位符容器,直到您的数据被加载。在这种情况下,这是 lat 和 long 参数。

Widget methodReturningWidget() 
    // In case your data is not ready, return empty container
    if (lat == null || long == null) 
      return Container();
    
    // In case your data is present, return GoogleMap object
    return Container(
      height: 350,
      child: GoogleMap(
        markers: Set.from(markers),
        initialCameraPosition: CameraPosition(
            target: LatLng(lat, long),
            zoom: 15.0),
          myLocationEnabled: true,
          compassEnabled: true,
          myLocationButtonEnabled: true,
          mapType: MapType.normal,
          onMapCreated: (GoogleMapController controller) 
            controller.setMapStyle(Utils.mapStyles);
          ),
    );

导致您的应用程序崩溃的部分代码是这里的LatLng(lat, long),它试图创建对象,但它的参数 lat 和 long 为空。

【讨论】:

LatLng 是否为 null 或以这种方式设置都没有关系: initialCameraPosition: _myLocation, myLocation 为静态 final CameraPosition _myLocation = CameraPosition(target: LatLng(33.3088364, -72.6965111), zoom: 7) ;在我按下按钮绘制坐标后,它仍然会崩溃。 :/ 还有其他想法吗? 哦,等一下。刚刚看到你做了一个容器。现在试试。 完全相同的错误。 :-/ 我设置了 var long, lat;顶上..我的地图加载得很好,但只要我按下按钮来绘制点......断言失败。 为什么我什至需要为此启用经纬度或位置。这太疯狂了。我只是想绘制点。我不明白为什么我的位置甚至必须启用才能执行此操作。几天来我一直在试图找出这些垃圾 没关系。我的地图甚至没有加载。我只是忘记将它从原始树中删除并将其移动到返回容​​器函数下。【参考方案2】:

我没有一个大概的答案。不过,我相信我找到了原因。

Map<double, double> m = (await sheet.values.map.column(3, fromRow: 2)).map((
    key, value) =>
    MapEntry(double.parse(key), double.parse(value)));
Map<double, double> m2 = (await sheet.values.map.column(4, fromRow: 2))
    .map((key, value) =>
    MapEntry(double.parse(key), double.parse(value)));

print(_markers);

setState(() 

  Iterable _markers = Iterable.generate(10, (index) 
    LatLng latLngMarker = LatLng(m["test$index"], m2["test$index"]);
    return Marker(markerId: MarkerId("test$index"), position: latLngMarker);
  );

  markers = _markers;

简而言之,我以某种方式不正确地调用了 lat 和 long,它引发了错误。我通过从当前位置绘制一个点来验证这一点。这样做没有任何问题。我将不得不研究如何正确调用我的列(坐标)。如果有人有任何见解,请告诉我。谢谢

编辑:我想我找到了问题。

我的 m 和 m2 正在打印键和值...!!钥匙把一切都搞砸了。

【讨论】:

以上是关于断言失败:'纬度!= null':不正确。我已经尝试了几件事的主要内容,如果未能解决你的问题,请参考以下文章

断言失败:第 24 行 pos 15:'color != null && color.alpha == 0xFF':不正确

断言失败:第 551 行 pos 12:'child.hasSize':不正确

断言失败:第 6075 行 pos 12:'child == _child':不正确

断言行 5120 pos 12 失败:'child = _child' 不正确

断言失败:在 Flutter 中使用 Navigator.popUntil() 时 !_debugLocked 不正确

Flutter - 断言失败:第 61 行第 12 行:'_route == ModalRoute.of(context)':不正确