我正在使用geolocator插件并获取当前的纬度和经度,但无法在Flutter应用程序的初始状态下加载它。 它显示了渲染错误。
void initState() {
// TODO: implement initState
super.initState();
getCurrentLocation();
}
void getCurrentLocation() async {
var answer = await Geolocator().getCurrentPosition();
setState(() {
latitude = answer.latitude;
longitude = answer.longitude;
});
}
地图会在几毫秒后更新为当前位置,但显示这些错误。 I / flutter(14143):W小工具库引起的异常CA ═════════════════════════
I / flutter(14143):在构建HomePage(脏,状态:_HomePageState#d55de)时引发了以下断言:
I / flutter(14143):“ package:google_maps_flutter / src / location.dart”:断言失败:第17行pos 16:“ latitude!=
I / flutter(14143):null':不正确。
I / flutter(14143):
I / flutter(14143):要么断言表明框架本身有错误,要么我们应该实质性地提供
I / flutter(14143):此错误消息中的更多信息可帮助您确定和解决根本原因。
I / flutter(14143):无论哪种情况,请通过在GitHub上提交错误来报告此断言:
答案 0 :(得分:0)
我几乎不知道发生了什么,但是基于代码,因为您有一个.then,在.then函数发生之前,您的纬度和经度为null,而当您有.then时,其余代码就不在等待中为将来解决。尝试在初始状态下将经度和纬度初始化为null以外的其他值,
void initState() {
// TODO: implement initState
super.initState();
latitude = 0;
longitude = 0;
getCurrentLocation().then((k) {
latitude = k.latitude;
longitude = k.longitude;
setState(() {});
});
}
答案 1 :(得分:0)
我一直尝试了很多方法,直到我发现这种方法,这要归功于一个善良的人,他帮助了另一个扑扑的Facebook小组。确保在pubspec.yaml中将位置更新为最新版本
依赖性: 位置:^ 2.3.5 然后将其更改为以下代码:
LocationData _currentLocation;
StreamSubscription<LocationData> _locationSubscription;
var _locationService = new Location();
String error;
void initState() {
super.initState();
initPlatformState();
_locationSubscription = _locationService
.onLocationChanged()
.listen((LocationData currentLocation) async {
setState(() {
_currentLocation = currentLocation;
});
});
}
void initPlatformState() async {
try {
_currentLocation = await _locationService.getLocation();
} on PlatformException catch (e) {
if (e.code == 'PERMISSION_DENIED') {
error = 'Permission denied';
}else if(e.code == "PERMISSION_DENIED_NEVER_ASK"){
error = 'Permission denied';
}
_currentLocation = null;
}
Run code snippetReturn to post
您可以将经度和纬度输入为
_currentLocation.longitude和_currentLocation.latitude
这些将返回双精度值。此外,https://pub.dev/packages/location#-readme-tab-
还有更多选项答案 2 :(得分:0)
作为Abbas.M的建议,我正在使用FutureBuilder Widget解决我的问题。
FutureBuilder小部件: https://www.youtube.com/watch?v=ek8ZPdWj4Qo
我要声明_future变量
Future<Position> _future;
我正在initState中调用异步方法
void initState() {
// TODO: implement initState
super.initState();
_future = getCurrentLocation();
}
使用FutureBuilder小部件解决了我的问题,并将异步函数返回值传递给FutureBuilder小部件的参数。
此条件if(snapshot.connectionState == ConnectionState.done)有助于查找异步函数是否已完成并返回值。如果它处于“完成”状态,则表示函数已完成并返回。
如果不满足该条件,则意味着异步功能已完成,因此我正在使用CircularProgressIndicator小部件来通知用户了解应用正在加载。
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Flutter Krish"),
),
body: FutureBuilder(
future: _future,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
if (!snapshot.hasError) {
print(snapshot.data.latitude);
return Stack(children: <Widget>[
GoogleMap(
initialCameraPosition: CameraPosition(
target: LatLng(
snapshot.data.latitude, snapshot.data.longitude),
zoom: 12.0),
onMapCreated: mapCreated,
),
Positioned(
top: 30.0,
left: 15.0,
right: 15.0,
child: Container(
height: 50.0,
width: double.infinity,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10.0),
color: Colors.white),
child: TextField(
decoration: InputDecoration(
border: InputBorder.none,
hintText: 'Enter Address',
contentPadding:
EdgeInsets.only(top: 15.0, left: 15.0),
suffixIcon: IconButton(
icon: Icon(Icons.search),
onPressed: searchAndNavigate,
iconSize: 30.0,
)),
onChanged: (value) {
searchAddress = value;
},
),
),
),
]);
}
} else {
return Center(child: CircularProgressIndicator());
}
}));
}
Future<Position> getCurrentLocation() async
{
var answer = await Geolocator().getCurrentPosition();
return answer;
}