Flutter如何根据定位服务开关状态自动切换显示对应Widget
Flutter 监听设备定位开关状态自动切换页面实现
实现思路
和现有蓝牙状态监听的逻辑完全一致,使用StreamBuilder订阅定位服务状态变化流,状态变更时自动触发页面重建,切换对应展示的Widget,无需手动触发刷新。
具体步骤
- 第一步:添加定位能力依赖
在项目pubspec.yaml文件的dependencies节点下添加定位库依赖:
dependencies: flutter: sdk: flutter geolocator: ^11.0.0
执行flutter pub get完成依赖安装。
- 第二步:添加平台必要配置
- Android端:在
android/app/src/main/AndroidManifest.xml中添加定位权限声明
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />- iOS端:在
ios/Runner/Info.plist中添加定位权限使用描述
<key>NSLocationWhenInUseUsageDescription</key> <string>App需要定位权限为您提供对应服务</string> - Android端:在
- 第三步:编写页面构建逻辑
直接参照蓝牙监听的写法,将流替换为定位服务状态流即可,使用前需要在文件头部导入定位包:import 'package:geolocator/geolocator.dart';
完整代码示例:
Widget build(BuildContext context) { return MaterialApp( title: '定位状态Demo', debugShowCheckedModeBanner: false, theme: ThemeData( primarySwatch: Colors.blue, ), home: StreamBuilder<ServiceStatus>( // 订阅系统定位服务开关状态变化流 stream: Geolocator.getServiceStatusStream(), initialData: null, builder: (c, snapshot) { ServiceStatus? locationState = snapshot.data; // 初始加载时主动获取一次当前定位开关状态,避免首屏空白 if (locationState == null) { Geolocator.isLocationServiceEnabled().then((isEnabled) { locationState = isEnabled ? ServiceStatus.enabled : ServiceStatus.disabled; // 首次状态获取后触发一次页面刷新 (c as StatefulElement).markNeedsBuild(); }); // 初始加载态展示loading组件 return const Scaffold( body: Center(child: CircularProgressIndicator()), ); } // 定位服务开启时展示业务数据页 if (locationState == ServiceStatus.enabled) { return const BusinessDataWidget(); } // 定位服务关闭时展示定位关闭提示页 return const LocationOffScreen(); }), ); }
效果说明
- 该实现无需手动轮询定位状态,用户在系统设置、通知栏切换定位开关后,回到APP时流会自动接收到最新状态,自动切换展示的Widget
- 逻辑结构和现有蓝牙状态监听代码完全对齐,维护成本低
注意:如果项目已经做过定位权限申请逻辑,可以直接复用,不需要额外重复申请权限,
getServiceStatusStream()仅监听定位服务的开关状态,不涉及权限申请逻辑。
内容的提问来源于stack exchange,提问作者Dhaval Chaudhari
相关产品推荐
相关产品推荐

