Flutter get user location real time error: The setter 'latitude' was called on null
Flutter get user location real time error: The setter 'latitude' was called on null
我是新手。我正在尝试获取用户位置的实时信息。为此,我使用了定位插件 (https://pub.dev/packages/location)。
问题是在分配位置之前填充地图,并返回错误:
setter 'latitude' 被调用为 null。
这是主镖:
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'dart:async';
import 'package:flutter/services.dart';
import 'package:location/location.dart';
import './models/userLocation.dart';
void main() => runApp(Maps());
class Maps extends StatefulWidget {
@override
_MapsState createState() => _MapsState();
}
class _MapsState extends State<Maps> {
LocationData currentLocation;
UserLocation _currentLocation;
var location = new Location();
String error;
void _onMapCreated(GoogleMapController controller) {
mapController = controller;
}
GoogleMapController mapController;
void initState() {
super.initState();
initMapState();
}
initMapState() async {
try {
var userLocation = await location.getLocation();
_currentLocation = UserLocation(
latitude: userLocation.latitude,
longitude: userLocation.longitude,
);
} on PlatformException catch (e) {
if (e.code == 'PERMISSION_DENIED') {
error = 'Permission denied';
}
return _currentLocation;
}
location.onLocationChanged().listen((LocationData currentLocation) {
print(currentLocation.latitude);
print(currentLocation.longitude);
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Create new trip'),
backgroundColor: Colors.green[700],
),
body: GoogleMap(
onMapCreated: _onMapCreated,
initialCameraPosition: CameraPosition(
target:
LatLng(_currentLocation?.latitude,_currentLocation?.longitude),
zoom: 11.0,
),
),
),
);
}
}
以下是位置模型:
class UserLocation {
double latitude;
double longitude;
UserLocation({this.latitude, this.longitude});
}
感谢您的支持。
谢谢,
编辑:
更新的工作文件:
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'dart:async';
import 'package:flutter/services.dart';
import 'package:location/location.dart';
import './models/userLocation.dart';
void main() => runApp(Maps());
class Maps extends StatefulWidget {
@override
_MapsState createState() => _MapsState();
}
class _MapsState extends State<Maps> {
Location location = new Location();
UserLocation userLocation;
StreamSubscription<LocationData> positionSubscription;
UserLocation _currentLocation;
String error;
void _onMapCreated(GoogleMapController controller) {
mapController = controller;
}
GoogleMapController mapController;
@override
void initState() {
super.initState();
positionSubscription = location
.onLocationChanged()
.handleError((error) => print(error))
.listen(
(newPosition) => setState(() {
_currentLocation = UserLocation(
latitude: newPosition.latitude,
longitude: newPosition.longitude,
);
}),
);
}
@override
void dispose() {
positionSubscription?.cancel();
super.dispose();
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Create new trip'),
backgroundColor: Colors.green[700],
),
body: GoogleMap(
onMapCreated: _onMapCreated,
initialCameraPosition: CameraPosition(
target:
LatLng(_currentLocation.latitude,_currentLocation.longitude),
zoom: 11.0,
),
),
),
);
}
}
所以,因为你的 initState 没有使用 @override 这个方法
未调用
您不能在 onInit 回调中使用异步调用。这是错误的。再一次,你
错过了@override。
According to docs 你不需要打电话给 getLocation
因为你
已经订阅了地点。
理想情况下,您需要这样的东西:
UserLocation userPosition;
StreamSubscription<LocationData> positionSubscription;
@override
void initState() {
super.initState();
positionSubscription = location
.onLocationChanged()
.handleError((error) => print(error))
.listen(
(newPosition) => setState(() {
_currentLocation = UserLocation(
latitude: newPosition.latitude,
longitude: newPosition.longitude,
);
}),
);
}
@override
void dispose() {
positionSubscription?.cancel();
super.dispose();
}
在initMapState();
后面写super.initState()
因为调用super.initState()
后直接调用build()
不会等待initMapState()
完成它执行
void initState() {
initMapState();
super.initState();
}
我是新手。我正在尝试获取用户位置的实时信息。为此,我使用了定位插件 (https://pub.dev/packages/location)。
问题是在分配位置之前填充地图,并返回错误:
setter 'latitude' 被调用为 null。
这是主镖:
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'dart:async';
import 'package:flutter/services.dart';
import 'package:location/location.dart';
import './models/userLocation.dart';
void main() => runApp(Maps());
class Maps extends StatefulWidget {
@override
_MapsState createState() => _MapsState();
}
class _MapsState extends State<Maps> {
LocationData currentLocation;
UserLocation _currentLocation;
var location = new Location();
String error;
void _onMapCreated(GoogleMapController controller) {
mapController = controller;
}
GoogleMapController mapController;
void initState() {
super.initState();
initMapState();
}
initMapState() async {
try {
var userLocation = await location.getLocation();
_currentLocation = UserLocation(
latitude: userLocation.latitude,
longitude: userLocation.longitude,
);
} on PlatformException catch (e) {
if (e.code == 'PERMISSION_DENIED') {
error = 'Permission denied';
}
return _currentLocation;
}
location.onLocationChanged().listen((LocationData currentLocation) {
print(currentLocation.latitude);
print(currentLocation.longitude);
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Create new trip'),
backgroundColor: Colors.green[700],
),
body: GoogleMap(
onMapCreated: _onMapCreated,
initialCameraPosition: CameraPosition(
target:
LatLng(_currentLocation?.latitude,_currentLocation?.longitude),
zoom: 11.0,
),
),
),
);
}
}
以下是位置模型:
class UserLocation {
double latitude;
double longitude;
UserLocation({this.latitude, this.longitude});
}
感谢您的支持。
谢谢,
编辑:
更新的工作文件:
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'dart:async';
import 'package:flutter/services.dart';
import 'package:location/location.dart';
import './models/userLocation.dart';
void main() => runApp(Maps());
class Maps extends StatefulWidget {
@override
_MapsState createState() => _MapsState();
}
class _MapsState extends State<Maps> {
Location location = new Location();
UserLocation userLocation;
StreamSubscription<LocationData> positionSubscription;
UserLocation _currentLocation;
String error;
void _onMapCreated(GoogleMapController controller) {
mapController = controller;
}
GoogleMapController mapController;
@override
void initState() {
super.initState();
positionSubscription = location
.onLocationChanged()
.handleError((error) => print(error))
.listen(
(newPosition) => setState(() {
_currentLocation = UserLocation(
latitude: newPosition.latitude,
longitude: newPosition.longitude,
);
}),
);
}
@override
void dispose() {
positionSubscription?.cancel();
super.dispose();
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Create new trip'),
backgroundColor: Colors.green[700],
),
body: GoogleMap(
onMapCreated: _onMapCreated,
initialCameraPosition: CameraPosition(
target:
LatLng(_currentLocation.latitude,_currentLocation.longitude),
zoom: 11.0,
),
),
),
);
}
}
所以,因为你的 initState 没有使用 @override 这个方法 未调用
您不能在 onInit 回调中使用异步调用。这是错误的。再一次,你 错过了@override。
According to docs 你不需要打电话给
getLocation
因为你 已经订阅了地点。
理想情况下,您需要这样的东西:
UserLocation userPosition;
StreamSubscription<LocationData> positionSubscription;
@override
void initState() {
super.initState();
positionSubscription = location
.onLocationChanged()
.handleError((error) => print(error))
.listen(
(newPosition) => setState(() {
_currentLocation = UserLocation(
latitude: newPosition.latitude,
longitude: newPosition.longitude,
);
}),
);
}
@override
void dispose() {
positionSubscription?.cancel();
super.dispose();
}
在initMapState();
后面写super.initState()
因为调用super.initState()
后直接调用build()
不会等待initMapState()
完成它执行
void initState() {
initMapState();
super.initState();
}