如何使用geolocator软件包自动更新Flutter中的gps坐标值?

tv6aics1  于 2023-01-21  发布在  Flutter
关注(0)|答案(1)|浏览(195)

我想在flutter中创建一个应用程序页面,当我在街上走动时,gps的经度和纬度值会不断更新,就像谷歌Map一样。
我在代码中导入了以下库。

import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:geolocator/geolocator.dart';
import 'dart:async';

接下来我创建了LocationPageWidget的基本框架

class LocationPage extends ConsumerWidget {
  String longitude = "";
  String latitude = "";

  @override
  Widget build(BuildContext context, WidgetRef ref) {
    return MaterialApp(
        home: Scaffold(
            body: Center(
                child: Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        Text("Longitude:: $longitude"),
        Text("Latitude:: $latitude"),
      ],
    ))));
  }
}

我向LocationPage添加了一个构造函数,并将以下代码

LocationPage() {
    final LocationSettings locationSettings = LocationSettings(
      accuracy: LocationAccuracy.high,
      distanceFilter: 100,
    );
    StreamSubscription<Position> positionStream =
        Geolocator.getPositionStream(locationSettings: locationSettings)
            .listen((Position? position) {
      longitude = position!.longitude.toString();
      latitude = position.latitude.toString();
    });
  }

我知道我做错了什么,但是我不知道怎么做!!我尝试了很多其他的方法来使用riverpod,但是都失败了。我知道Geolocator.getPositionStream返回一个Stream<Position>,我不知道下一步该怎么做!
以下是指向地理定位器包https://pub.dev/packages/geolocator的链接

aor9mmx1

aor9mmx11#

您应该将StreamSubscription代码移出构造函数,放入LocationPage小部件的initState方法中,这样可以确保仅在第一次创建小部件时设置流,而不是每次重建小部件时都设置流。
当您在流中接收到新的位置时,还需要设置longitude和latitude变量的状态,以便小部件可以使用新的值重新构建。
下面是一个如何实现此功能的示例:

class LocationPage extends StatefulWidget {
  @override
  _LocationPageState createState() => _LocationPageState();
}

class _LocationPageState extends State<LocationPage> {
  String longitude = "";
  String latitude = "";
  StreamSubscription<Position> _positionStream;

  @override
  void initState() {
    super.initState();
    final LocationSettings locationSettings = LocationSettings(
      accuracy: LocationAccuracy.high,
      distanceFilter: 100,
    );
    _positionStream = Geolocator.getPositionStream(locationSettings: locationSettings)
            .listen((Position? position) {
      setState(() {
        longitude = position!.longitude.toString();
        latitude = position.latitude.toString();
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        home: Scaffold(
            body: Center(
                child: Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        Text("Longitude:: $longitude"),
        Text("Latitude:: $latitude"),
      ],
    ))));
  }

  @override
  void dispose() {
    _positionStream.cancel();
    super.dispose();
  }
}

这应该对你有用,如果有用就告诉我!

相关问题