我需要使用gps的权限才能出现,由于某种原因它没有出现在这里,如果gps被激活,图标会变成绿色,如果gps关闭,图标会变成红色,但没有成功。很快它也不会通知用户的地址。我将分享代码:
class AppBarCustom extends StatefulWidget {
const AppBarCustom({Key? key}) : super(key: key);
@override
State<AppBarCustom> createState() => _AppBarCustomState();
}
class _AppBarCustomState extends State<AppBarCustom> {
late SharedPreferences prefs;
String address = 'Loanding...';
double currentKm = 0;
StreamSubscription<Position>? _positionStreamSubscription;
@override
void initState() {
super.initState();
initSharedOreferences();
checkGpsStatusOnLoad();
getLocationData();
}
Future<void> initSharedOreferences() async {
prefs = await SharedPreferences.getInstance();
}
Future<void> checkGpsStatusOnLoad() async {
LocationPermission permission = await Geolocator.checkPermission();
if (permission == LocationPermission.denied) {
setState(() {
Provider.of<GpsStatusProvider>(context, listen: false)
.setGpsActive(false);
});
} else {
bool serviceEnabled = await Geolocator.isLocationServiceEnabled();
if (!serviceEnabled) {
setState(() {
Provider.of<GpsStatusProvider>(context, listen: false)
.setGpsActive(false);
});
} else {
setState(() {
Provider.of<GpsStatusProvider>(context, listen: false)
.setGpsActive(true);
});
}
}
}
Future<void> getLocationData() async {
try {
Position position = await Geolocator.getCurrentPosition(
desiredAccuracy: LocationAccuracy.high,
);
List<Placemark> placemarks = await placemarkFromCoordinates(
position.latitude,
position.longitude,
);
Placemark placemark = placemarks.first;
String streetName = placemark.thoroughfare ?? 'N/A';
double? km = position.speed;
setState(() {
address = 'Street: $streetName';
currentKm = km;
});
} catch (e) {
if (kDebugMode) {
print('Erro: $e');
}
}
}
@override
void dispose() {
super.dispose();
_positionStreamSubscription?.cancel();
}
@override
Widget build(BuildContext context) {
return Consumer<GpsStatusProvider>(
builder: (context, gpsStatusProvider, _) {
return Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
const Spacer(),
Text(
'Street: $address',
style: const TextStyle(fontSize: 15),
),
const Spacer(),
Text(
'Km: ${currentKm.toStringAsFixed(3)}',
style: const TextStyle(fontSize: 15),
),
const Spacer(),
CircleAvatar(
radius: 13,
backgroundColor: gpsStatusProvider.isGpsActive
? Colors.green
: Colors.red,
child: const Icon(
Icons.gps_fixed,
color: Colors.white,
size: 20,
),
),
],
);
},
);
}
}
这是使用的提供程序:
class GpsStatusProvider with ChangeNotifier {
bool _isGpsActive = false;
late StreamController<bool> _gpsActiveController;
Stream<bool> get isGpsActiveStream => _gpsActiveController.stream;
GpsStatusProvider() {
_gpsActiveController = StreamController<bool>.broadcast();
}
bool get isGpsActive => _isGpsActive;
void setGpsActive(bool isActive) {
_isGpsActive = isActive;
_gpsActiveController.add(isActive);
notifyListeners();
}
@override
void dispose() {
_gpsActiveController.close();
super.dispose();
}
}
您尚未开始收听
GpsStatusProvider
通知听众进行直播。更新您的 initState
方法来收听流。
@override
void initState() {
super.initState();
initSharedOreferences();
checkGpsStatusOnLoad();
getLocationData();
// Start listening to GPS status changes
Provider.of<GpsStatusProvider>(context, listen: false)
.isGpsActiveStream
.listen((isActive) {
setState(() {
// Update UI based on isActive
});
});
}