Flutter中Google Maps初始化当前位置报错及解决
解决Google Maps初始化时位置未加载的LateInitializationError问题
问题场景
尝试获取设备当前位置并用于Google Maps的initialCameraPosition,函数执行后能成功将坐标赋值给_currentPosition,但页面启动时抛出错误:
LateError (LateInitializationError: Field 'currentPosition' has not been initialized.)
核心原因是地图组件的渲染速度快于异步位置变量的赋值过程。
初始代码
import 'package:flutter/material.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:geolocator/geolocator.dart'; class UserMapInfo extends StatefulWidget { const UserMapInfo({Key? key}) : super(key: key); @override State<UserMapInfo> createState() => _UserMapInfoState(); } class _UserMapInfoState extends State<UserMapInfo> { late GoogleMapController mapController; late LatLng _currentPosition; @override void initState() { super.initState(); getLocation(); } getLocation() async { LocationPermission permission; permission = await Geolocator.requestPermission(); Position position = await Geolocator.getCurrentPosition( desiredAccuracy: LocationAccuracy.high); double lat = position.latitude; double long = position.longitude; LatLng location = LatLng(lat, long); setState(() { _currentPosition = location; }); } void _onMapCreated(GoogleMapController controller) { mapController = controller; } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('Map'), ), body: GoogleMap( onMapCreated: _onMapCreated, initialCameraPosition: CameraPosition( target: _currentPosition, zoom: 16.0, ), ), ); } }
中间尝试的问题
- 将
_currentPosition改为可空类型LatLng?,添加测试坐标basePosition并用空值合并运算符,地图始终使用basePosition,无法切换到真实位置 - 直接用
!空检查时,抛出错误:
_CastError (Null check operator used on a null value)
最终解决方案
通过添加加载状态_isLoading,等待位置获取完成后再渲染地图组件,解决了初始化顺序问题:
import 'package:flutter/material.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:geolocator/geolocator.dart'; class UserMapInfo extends StatefulWidget { const UserMapInfo({Key? key}) : super(key: key); @override State<UserMapInfo> createState() => _UserMapInfoState(); } class _UserMapInfoState extends State<UserMapInfo> { late GoogleMapController mapController; LatLng? _currentPosition; bool _isLoading = true; @override void initState() { super.initState(); getLocation(); } getLocation() async { LocationPermission permission; permission = await Geolocator.requestPermission(); Position position = await Geolocator.getCurrentPosition( desiredAccuracy: LocationAccuracy.high); double lat = position.latitude; double long = position.longitude; LatLng location = LatLng(lat, long); setState(() { _currentPosition = location; _isLoading = false; }); } void _onMapCreated(GoogleMapController controller) { mapController = controller; } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('Map'), ), body: _isLoading ? const Center( child: CircularProgressIndicator(), ) : GoogleMap( onMapCreated: _onMapCreated, initialCameraPosition: CameraPosition( target: _currentPosition!, zoom: 16.0, ), ), ); } }
内容的提问来源于stack exchange,提问作者Sergey M
相关产品推荐
相关产品推荐

