如何修复[ERROR:flutter / lib / ui / ui_dart_state.cc(166)]未处理的异常:NoSuchMethodError:方法'<='在null上被调用。错误?

时间:2020-06-30 12:42:29

标签: google-maps flutter google-cloud-firestore

我一直收到此错误,而且由于昨天的相同代码,我不知道如何解决该错误。 (这是一个测试应用程序,它使用Google地图和Firebase Firestore在地图上保存和查询标记)

我认为这可能与flutter的安装有关,因此我尝试使用稳定版和Beta版,但是在两个版本中都发生了相同的错误。

这是错误:

E/flutter (16809): [ERROR:flutter/lib/ui/ui_dart_state.cc(166)] Unhandled Exception: NoSuchMethodError: The method '<=' was called on null.
E/flutter (16809): Receiver: null
E/flutter (16809): Tried calling: <=(102.0)
E/flutter (16809): #0      Object.noSuchMethod (dart:core-patch/object_patch.dart:51:5)
E/flutter (16809): #1      GeoFireCollectionRef.within.<anonymous closure>.<anonymous closure> (package:geoflutterfire/src/collection.dart:125:31)
E/flutter (16809): #2      WhereIterator.moveNext (dart:_internal/iterable.dart:442:13)
E/flutter (16809): #3      new List.from (dart:core-patch/array_patch.dart:50:19)
E/flutter (16809): #4      new List.of (dart:core-patch/array_patch.dart:68:17)
E/flutter (16809): #5      Iterable.toList (dart:core/iterable.dart:404:12)
E/flutter (16809): #6      GeoFireCollectionRef.within.<anonymous closure> (package:geoflutterfire/src/collection.dart:126:16)
E/flutter (16809): #7      _MapStream._handleData (dart:async/stream_pipe.dart:219:31)
E/flutter (16809): #8      _ForwardingStreamSubscription._handleData (dart:async/stream_pipe.dart:157:13)
E/flutter (16809): #9      _rootRunUnary (dart:async/zone.dart:1198:47)
E/flutter (16809): #10     _CustomZone.runUnary (dart:async/zone.dart:1100:19)
E/flutter (16809): #11     _CustomZone.runUnaryGuarded (dart:async/zone.dart:1005:7)
E/flutter (16809): #12     _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:357:11)
E/flutter (16809): #13     _BufferingStreamSubscription._add (dart:async/stream_impl.dart:285:7)
E/flutter (16809): #14     _SyncStreamControllerDispatch._sendData (dart:async/stream_controller.dart:784:19)
E/flutter (16809): #15     _StreamController._add (dart:async/stream_controller.dart:655:7)
E/flutter (16809): #16     _StreamController.add (dart:async/stream_controller.dart:597:5)
E/flutter (16809): #17     CombineLatestStream._buildController.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:rxdart/src/streams/combine_latest.dart:293:30)
E/flutter (16809): #18     _rootRunUnary (dart:async/zone.dart:1198:47)
E/flutter (16809): #19     _CustomZone.runUnary (dart:async/zone.dart:1100:19)
E/flutter (16809): #20     _CustomZone.runUnaryGuarded (dart:async/zone.dart:1005:7)
E/flutter (16809): #21     _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:357:11)
E/flutter (16809): #22     _BufferingStreamSubscription._add (dart:async/stream_impl.dart:285:7)
E/flutter (16809): #23     _ForwardingStreamSubscription._add (dart:async/stream_pipe.dart:127:11)
E/flutter (16809): #24     _MapStream._handleData (dart:async/stream_pipe.dart:224:10)
E/flutter (16809): #25     _ForwardingStreamSubscription._handleData (dart:async/stream_pipe.dart:157:13)
E/flutter (16809): #26     _rootRunUnary (dart:async/zone.dart:1198:47)
E/flutter (16809): #27     _CustomZone.runUnary (dart:async/zone.dart:1100:19)
E/flutter (16809): #28     _CustomZone.runUnaryGuarded (dart:async/zone.dart:1005:7)
E/flutter (16809): #29     _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:357:11)
E/flutter (16809): #30     _BufferingStreamSubscription._add (dart:async/stream_impl.dart:285:7)
E/flutter (16809): #31     _ForwardingStreamSubscription._add (dart:async/stream_pipe.dart:127:11)
E/flutter (16809): #32     _MapStream._handleData (dart:async/stream_pipe.dart:224:10)
E/flutter (16809): #33     _ForwardingStreamSubscription._handleData (dart:async/stream_pipe.dart:157:13)
E/flutter (16809): #34     _rootRunUnary (dart:async/zone.dart:1198:47)
E/flutter (16809): #35     _CustomZone.runUnary (dart:async/zone.dart:1100:19)
E/flutter (16809): #36     _CustomZone.runUnaryGuarded (dart:async/zone.dart:1005:7)
E/flutter (16809): #37     _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:357:11)
E/flutter (16809): #38     _DelayedData.perform (dart:async/stream_impl.dart:611:14)
E/flutter (16809): #39     _StreamImplEvents.handleNext (dart:async/stream_impl.dart:730:11)
E/flutter (16809): #40     _PendingEvents.schedule.<anonymous closure> (dart:async/stream_impl.dart:687:7)
E/flutter (16809): #41     _rootRun (dart:async/zone.dart:1182:47)
E/flutter (16809): #42     _CustomZone.run (dart:async/zone.dart:1093:19)
E/flutter (16809): #43     _CustomZone.runGuarded (dart:async/zone.dart:997:7)
E/flutter (16809): #44     _CustomZone.bindCallbackGuarded.<anonymous closure> (dart:async/zone.dart:1037:23)
E/flutter (16809): #45     _rootRun (dart:async/zone.dart:1190:13)
E/flutter (16809): #46     _CustomZone.run (dart:async/zone.dart:1093:19)
E/flutter (16809): #47     _CustomZone.runGuarded (dart:async/zone.dart:997:7)
E/flutter (16809): #48     _CustomZone.bindCallbackGuarded.<anonymous closure> (dart:async/zone.dart:1037:23)
E/flutter (16809): #49     _microtaskLoop (dart:async/schedule_microtask.dart:41:21)
E/flutter (16809): #50     _startMicrotaskLoop (dart:async/schedule_microtask.dart:50:5)
E/flutter (16809): 

这是我的main.dart文件:

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:geoflutterfire/geoflutterfire.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'dart:async';
import 'package:permission_handler/permission_handler.dart';
import 'package:awesome_dialog/awesome_dialog.dart';
import 'package:rxdart/rxdart.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        // This is the theme of your application.
        //
        // Try running your application with "flutter run". You'll see the
        // application has a blue toolbar. Then, without quitting the app, try
        // changing the primarySwatch below to Colors.green and then invoke
        // "hot reload" (press "r" in the console where you ran "flutter run",
        // or simply save your changes to "hot reload" in a Flutter IDE).
        // Notice that the counter didn't reset back to zero; the application
        // is not restarted.
        primarySwatch: Colors.blue,
        // This makes the visual density adapt to the platform that you run
        // the app on. For desktop platforms, the controls will be smaller and
        // closer together (more dense) than on mobile platforms.
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: FireMap(),
    );
  }
}

class FireMap extends StatefulWidget {
  @override
  _FireMapState createState() => _FireMapState();
}

class _FireMapState extends State<FireMap> {
  Firestore firestore = Firestore.instance;
  Geoflutterfire geo = Geoflutterfire();

  GoogleMapController _mapController;

  Map<MarkerId, Marker> markers =
      <MarkerId, Marker>{}; // CLASS MEMBER, MAP OF MARKS

  BehaviorSubject<double> radius = BehaviorSubject.seeded(100.0);
  Stream<dynamic> query;
  StreamSubscription subscription;

  Future<DocumentReference> _addGeoPoint(LatLng coordinates) async {
    GeoFirePoint point = geo.point(
        latitude: coordinates.latitude, longitude: coordinates.longitude);
    return firestore
        .collection('locations')
        .add({'position': point.data, 'name': 'Yay I can be queried!'});
  }

  void _add() {
//    var markerIdVal = MyWayToGenerateId();
    var markerIdVal = '123abc';
    final MarkerId markerId = MarkerId(markerIdVal);

    // creating a new MARKER
    final Marker marker = Marker(
      markerId: markerId,
      position: LatLng(24.150, -110.32
//        center.latitude + sin(_markerIdCounter * pi / 6.0) / 20.0,
//        center.longitude + cos(_markerIdCounter * pi / 6.0) / 20.0,
          ),
      infoWindow: InfoWindow(
          title: markerIdVal,
          snippet: '*',
          onTap: () {
            _onInfoWindowTapped(markerId);
          }),
      onTap: () {
        _onMarkerTapped(markerId);
      },
      draggable: true,
    );

    setState(() {
      // adding a new marker to map
      markers[markerId] = marker;
    });
  }

  void _addMarkerAtPosition(LatLng coordinates) {
    _addGeoPoint(coordinates);
    //    var markerIdVal = MyWayToGenerateId();
    var markerIdVal = coordinates.toString();
    final MarkerId markerId = MarkerId(markerIdVal);

    // creating a new MARKER
    final Marker marker = Marker(
      markerId: markerId,
      position: coordinates,
      infoWindow: InfoWindow(
          title: markerIdVal,
          snippet: '*',
          onTap: () {
            _onInfoWindowTapped(markerId);
          }),
      onTap: () {
        _onMarkerTapped(markerId);
      },
    );

    setState(() {
      // adding a new marker to map
      markers[markerId] = marker;
    });
  }

  void _onMarkerTapped(markerId) {
    print('MARKER TAPPED');
  }

  void _onInfoWindowTapped(MarkerId markerId) {
    print('MARKER INFO WINDOW TAPPED');
    //TODO SHOW INFO PANEL
    AwesomeDialog(
      context: context,
      dialogType: DialogType.NO_HEADER,
      title: markerId.value,
      desc: 'desc',
    )..show();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Stack(
        children: <Widget>[
          GoogleMap(
            initialCameraPosition:
                CameraPosition(target: LatLng(24.150, -110.32), zoom: 10),
            myLocationEnabled: true,
            mapType: MapType.hybrid,
            markers: Set<Marker>.of(markers.values),
            onMapCreated: _onMapCreated,
            onTap: _onTap,
          ),
          Positioned(
            bottom: 100,
            right: 0,
            child: FlatButton(
              shape: CircleBorder(),
              child: Padding(
                child: Icon(
                  Icons.pin_drop,
                  color: Colors.white,
                ),
                padding: EdgeInsets.all(8.0),
              ),
              color: Colors.green,
//              onPressed: () => _add(),
            ),
          ),
          Positioned(
            bottom: 50,
            left: 10,
            child: Slider(
              min: 100.0,
              max: 500.0,
              divisions: 4,
              value: radius.value,
              label: 'Radius ${radius.value}km',
              activeColor: Colors.green,
              inactiveColor: Colors.green.withOpacity(0.2),
              onChanged: _updateQuery,
            ),
          )
        ],
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: (){
//          _mapController.animateCamera(CameraUpdate.zoomOut());
        subscription.cancel();
        _startQuery();
        },
        child: Icon(Icons.zoom_out),
      ),
    );
  }

  void _updateMarkers(List<DocumentSnapshot> documentList) {
    print(documentList);

    markers.clear();

    setState(() {
      documentList.forEach((DocumentSnapshot document) {
        GeoPoint pos = document.data['position']['geopoint'];
        double distance = document.data['distance'];
        final MarkerId markerId =
            MarkerId(pos.latitude.toString() + '--' + pos.longitude.toString());
        var marker = Marker(
            markerId: markerId,
            position: LatLng(pos.latitude, pos.longitude),
            icon: BitmapDescriptor.defaultMarker,
            infoWindow: InfoWindow(
                title: markerId.value,
                snippet: '$distance kilometers from query center',
                onTap: () {
                  _onInfoWindowTapped(markerId);
                }));

        markers[markerId] = marker;
      });
    });
  }

  _startQuery() async {
    double screenWidth = MediaQuery.of(context).size.width;
    double screenHeight = MediaQuery.of(context).size.height;
    screenWidth *= MediaQuery.of(context).devicePixelRatio;
    screenHeight *= MediaQuery.of(context).devicePixelRatio;

    double middleX = screenWidth / 2;
    double middleY = screenHeight / 2;

    var pos = await _mapController
        .getLatLng(ScreenCoordinate(x: middleX.round(), y: middleY.round()));
//    var pos = LatLng(24.150, -110.32);

    double lat = pos.latitude;
    double lng = pos.longitude;
    print('getLatLng Position: ' + pos.toString());

    var ref = firestore.collection('locations');
    GeoFirePoint center = geo.point(latitude: lat, longitude: lng);

    _mapController.animateCamera(CameraUpdate.newLatLng(pos));

    subscription = radius.switchMap((rad) {
      return geo.collection(collectionRef: ref).within(
          center: center, radius: rad, field: 'position', strictMode: true);
    }).listen(_updateMarkers);
  }

  _updateQuery(value) {
    setState(() {
      radius.add(value);
    });
  }

  void _onMapCreated(GoogleMapController controller) async {
    setState(() {
      _mapController = controller;
    });
    if (await Permission.location.request().isGranted) {
      print('PERMISSION GRANTED: LOCATION');
    }
    _startQuery();
  }

  void _onTap(coordinates) {
//    _addMarkerAtPosition(coordinates);
    _addGeoPoint(coordinates);
    _mapController.animateCamera(CameraUpdate.newLatLng(coordinates));
  }

  @override
  void dispose() {
    subscription.cancel();
    super.dispose();
  }

}

还有我的pubspec.ymal文件:

name: googlemapstest
description: Google Maps Test App

# The following line prevents the package from being accidentally published to
# pub.dev using `pub publish`. This is preferred for private packages.
publish_to: 'none' # Remove this line if you wish to publish to pub.dev

# The following defines the version and build number for your application.
# A version number is three numbers separated by dots, like 1.2.43
# followed by an optional build number separated by a +.
# Both the version and the builder number may be overridden in flutter
# build by specifying --build-name and --build-number, respectively.
# In Android, build-name is used as versionName while build-number used as versionCode.
# Read more about Android versioning at https://developer.android.com/studio/publish/versioning
# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
# Read more about iOS versioning at
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
version: 1.0.0+1

environment:
  sdk: ">=2.7.0 <3.0.0"

dependencies:
  flutter:
    sdk: flutter


  # The following adds the Cupertino Icons font to your application.
  # Use with the CupertinoIcons class for iOS style icons.
  cupertino_icons: ^0.1.3
  google_maps_flutter: ^0.5.28+1
  firebase_core: ^0.4.5
  firebase_analytics: ^5.0.15
  cloud_firestore: ^0.13.7



  permission_handler: ^5.0.1+1
  awesome_dialog: ^1.1.3
  geoflutterfire: ^2.0.3+6


dev_dependencies:
  flutter_test:
    sdk: flutter

# For information on the generic Dart part of this file, see the
# following page: https://dart.dev/tools/pub/pubspec

# The following section is specific to Flutter.
flutter:

  # The following line ensures that the Material Icons font is
  # included with your application, so that you can use the icons in
  # the material Icons class.
  uses-material-design: true

谢谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您可能没有正确创建对象。

检查这种类型的声明:

<a href="/add/<item-id>/">

并更改为此

Foo obj; // wronge way of creating object
obj.method();

Foo obj = Foo(); // Corret way of creating object
obj.method();

PS:Foo obj = new Foo(); // Corret way of creating object obj.method(); 关键字现在在Dart中是可选的。