我一直收到此错误,而且由于昨天的相同代码,我不知道如何解决该错误。 (这是一个测试应用程序,它使用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
谢谢您的帮助!
答案 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中是可选的。