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

Flutter Geolocator 9.0.2在Android模拟器中无法使用的问题求助

问题解决:Flutter Geolocator在Android模拟器无法获取位置且无权限弹窗

核心问题:权限判断逻辑错误

你的LocationCubit中权限判断逻辑存在错误,导致即使权限未授权,也不会触发权限请求弹窗,直接尝试获取位置最终失败。

原代码中的条件使用||(逻辑或),会导致无论权限是什么状态,条件都会成立:比如当权限是denied时,locationPermission != LocationPermission.deniedForever为true,条件整体成立,不会进入else分支请求权限。

修复步骤

1. 修正权限判断逻辑

将条件改为&&(逻辑与),确保只有当权限既不是denied也不是deniedForever时,才尝试获取位置;否则请求权限,并在请求后重新检查权限状态:

修改后的LocationCubit代码:

import 'dart:developer';

import 'package:equatable/equatable.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:geolocator/geolocator.dart';

part 'location_state.dart';

class LocationCubit extends Cubit<LocationState> {
  LocationCubit() : super(const LocationInitial());

  Future<void> getLocation() async {
    LocationPermission locationPermission = await Geolocator.checkPermission();

    // 修正逻辑:权限既不是denied也不是deniedForever时,才获取位置
    if (locationPermission != LocationPermission.denied &&
        locationPermission != LocationPermission.deniedForever) {
      emit(const LocationLoading());

      try {
        Position position = await Geolocator.getCurrentPosition(
            desiredAccuracy: LocationAccuracy.high);
        log("$position");

        emit(LocationLoaded(
            longitude: position.longitude, latitude: position.latitude));
      } catch (error) {
        emit(const LocationError(
            message: '获取位置时发生错误'));
      }
    } else {
      // 请求权限后重新检查状态
      LocationPermission newPermission = await Geolocator.requestPermission();
      if (newPermission == LocationPermission.whileInUse ||
          newPermission == LocationPermission.always) {
        // 权限获取成功,重新调用获取位置
        await getLocation();
      } else {
        emit(const LocationError(
            message: '需要位置权限才能获取当前位置'));
      }
    }
  }
}

2. 确认AndroidManifest权限配置

确保AndroidManifest.xml中包含正确的权限声明,前台定位至少需要:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- 若需要后台定位,添加以下权限 -->
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />

3. 模拟器位置设置验证

  • 确保模拟器的位置服务已开启(进入模拟器设置 -> 位置 -> 开启位置服务)
  • 确认已通过模拟器位置设置成功模拟位置,重启应用测试
  • 可尝试删除模拟器中的应用,重新编译安装,避免缓存问题

其他注意事项

  • 你的compileSdkVersion为33,符合geolocator要求,无需修改
  • 若仍有问题,可尝试将geolocator包升级到最新稳定版,确保与Flutter版本兼容

内容的提问来源于stack exchange,提问作者Diraph

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 13:01:09