You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:17:53