GPS 和图标颜色变化的问题

问题描述 投票:0回答:1

我需要使用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();
  }
}
flutter gps
1个回答
0
投票

您尚未开始收听

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
    });
  });
}
© www.soinside.com 2019 - 2024. All rights reserved.