Flutter实时获取用户位置报错:The setter 'latitude' was called on null
解决Flutter location插件实时定位时地图加载触发的空指针错误
作为Flutter新手,你遇到的这个The setter 'latitude' was called on null错误,本质是地图组件在定位变量完成赋值前就已执行渲染,导致访问未初始化的_currentLocation属性时触发空指针。下面我帮你拆解问题并给出完善的修复方案:
问题根源
你的初始代码中,获取定位的initMapState是异步方法,而build方法会同步执行——这意味着地图加载时,_currentLocation还没被赋值,自然是null。同时,初始的位置监听没有关联setState,就算后续拿到位置数据,UI也不会自动刷新。
修复后的完整代码
main.dart
import 'package:flutter/material.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 = Location(); StreamSubscription<LocationData> positionSubscription; UserLocation _currentLocation; String error; void _onMapCreated(GoogleMapController controller) { mapController = controller; } GoogleMapController mapController; @override void initState() { super.initState(); // 监听位置变化流,每次获取新位置都通过setState更新UI 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) { // 位置未就绪时显示加载指示器,避免空指针 if (_currentLocation == null) { return MaterialApp( home: Scaffold( appBar: AppBar( title: const Text('Create new trip'), backgroundColor: Colors.green[700], ), body: const Center(child: CircularProgressIndicator()), ), ); } return MaterialApp( home: Scaffold( appBar: AppBar( title: const Text('Create new trip'), backgroundColor: Colors.green[700], ), body: GoogleMap( onMapCreated: _onMapCreated, initialCameraPosition: CameraPosition( target: LatLng(_currentLocation.latitude, _currentLocation.longitude), zoom: 11.0, ), ), ), ); } }
UserLocation 模型代码
class UserLocation { double latitude; double longitude; UserLocation({this.latitude, this.longitude}); }
核心修复说明
- 流监听+状态更新:通过
onLocationChanged()获取实时位置的流,每次收到新位置时调用setState更新_currentLocation,确保UI能同步刷新位置信息。 - 空状态兜底:在
build方法中增加_currentLocation的空判断,未就绪时显示加载指示器,彻底避免地图组件访问空变量的问题。 - 内存泄漏防护:在
dispose方法中取消位置流的订阅,防止页面销毁后仍持续监听位置导致内存浪费。
内容的提问来源于stack exchange,提问作者AbdalRahman Farag
相关产品推荐
相关产品推荐

