flutter - Flutter 获取用户位置实时错误:setter 'latitude' was called on null
问题描述
我是新手。我正在尝试获取用户位置的实时信息。为此,我使用了位置插件 ( https://pub.dev/packages/location )。
问题是地图在分配位置之前被填充,并返回错误:
设置器“纬度”在 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。
根据文档,您无需致电
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();
}
推荐阅读
- firebase - “字符串”类型不是“文件”类型的子类型
- bash - 如何从命令行将 html 模板文件插入 postgresql 字段
- aws-lambda - 无法从“urllib3.connection”导入名称“HTTPException”
- javascript - Jest 测试套件无法使用 await 运行
- java - 检查没有内置方法的字符串的结尾,如 Java 中的 endsWith()
- wpf - 安装在程序文件中的 WPF 应用程序刚刚退出 - 但在另一个文件夹中运行
- python - 使用python将CSV文件中的列打印到excel文件中
- node.js - 控制没有进入 node.js 中的 req.on
- python - 限制命令行参数的组合
- javascript - Jasmine/Jest 类型冲突