无法在Flutter应用程序中加载当前位置

时间:2019-07-03 17:20:16

标签: google-maps flutter dart

我正在使用geolocator插件并获取当前的纬度和经度,但无法在Flutter应用程序的初始状态下加载它。 它显示了渲染错误。

void initState() {
// TODO: implement initState
super.initState();
getCurrentLocation();

}

void getCurrentLocation() async {
var answer = await Geolocator().getCurrentPosition();
setState(() {
  latitude = answer.latitude;
  longitude = answer.longitude;
});

}

地图会在几毫秒后更新为当前位置,但显示这些错误。 I / flutter(14143):W小工具库引起的异常CA ═════════════════════════

I / flutter(14143):在构建HomePage(脏,状态:_HomePageState#d55de)时引发了以下断言:

I / flutter(14143):“ package:google_maps_flutter / src / location.dart”:断言失败:第17行pos 16:“ latitude!=

I / flutter(14143):null':不正确。

I / flutter(14143):

I / flutter(14143):要么断言表明框架本身有错误,要么我们应该实质性地提供

I / flutter(14143):此错误消息中的更多信息可帮助您确定和解决根本原因。

I / flutter(14143):无论哪种情况,请通过在GitHub上提交错误来报告此断言:

3 个答案:

答案 0 :(得分:0)

我几乎不知道发生了什么,但是基于代码,因为您有一个.then,在.then函数发生之前,您的纬度和经度为null,而当您有.then时,其余代码就不在等待中为将来解决。尝试在初始状态下将经度和纬度初始化为null以外的其他值,

void initState() {
// TODO: implement initState
super.initState();
latitude = 0;
longitude = 0;
getCurrentLocation().then((k) {
  latitude = k.latitude;
  longitude = k.longitude;
  setState(() {});
  });
}

答案 1 :(得分:0)

我一直尝试了很多方法,直到我发现这种方法,这要归功于一个善良的人,他帮助了另一个扑扑的Facebook小组。确保在pubspec.yaml中将位置更新为最新版本

依赖性:   位置:^ 2.3.5 然后将其更改为以下代码:

 
  LocationData _currentLocation;
  StreamSubscription<LocationData> _locationSubscription;

  var _locationService = new Location();
  String error;

  void initState() {
    super.initState();

    initPlatformState();

    _locationSubscription = _locationService
        .onLocationChanged()
        .listen((LocationData currentLocation) async {
      setState(() {
        _currentLocation = currentLocation;
      });
    });
  }

  void initPlatformState() async {
    try {
      _currentLocation = await _locationService.getLocation();


    } on PlatformException catch (e) {
      if (e.code == 'PERMISSION_DENIED') {
        error = 'Permission denied';
      }else if(e.code == "PERMISSION_DENIED_NEVER_ASK"){
        error = 'Permission denied';
      }
      _currentLocation = null;
    }
 Run code snippetReturn to post

您可以将经度和纬度输入为

_currentLocation.longitude和_currentLocation.latitude

这些将返回双精度值。此外,https://pub.dev/packages/location#-readme-tab-

还有更多选项

答案 2 :(得分:0)

作为Abbas.M的建议,我正在使用FutureBuilder Widget解决我的问题。

FutureBuilder小部件: https://www.youtube.com/watch?v=ek8ZPdWj4Qo

我要声明_future变量

Future<Position> _future;

我正在initState中调用异步方法

void initState() {
// TODO: implement initState
super.initState();
_future = getCurrentLocation();
}

使用FutureBuilder小部件解决了我的问题,并将异步函数返回值传递给FutureBuilder小部件的参数。

此条件if(snapshot.connectionState == ConnectionState.done)有助于查找异步函数是否已完成并返回值。如果它处于“完成”状态,则表示函数已完成并返回。

如果不满足该条件,则意味着异步功能已完成,因此我正在使用CircularProgressIndicator小部件来通知用户了解应用正在加载。

Widget build(BuildContext context) {
return Scaffold(
    appBar: AppBar(
      title: Text("Flutter Krish"),
    ),
    body: FutureBuilder(
        future: _future,
        builder: (context, snapshot) {
          if (snapshot.connectionState == ConnectionState.done) {
            if (!snapshot.hasError) {
              print(snapshot.data.latitude);
              return Stack(children: <Widget>[
                GoogleMap(
                  initialCameraPosition: CameraPosition(
                      target: LatLng(
                          snapshot.data.latitude, snapshot.data.longitude),
                      zoom: 12.0),
                  onMapCreated: mapCreated,
                ),
                Positioned(
                  top: 30.0,
                  left: 15.0,
                  right: 15.0,
                  child: Container(
                    height: 50.0,
                    width: double.infinity,
                    decoration: BoxDecoration(
                        borderRadius: BorderRadius.circular(10.0),
                        color: Colors.white),
                    child: TextField(
                      decoration: InputDecoration(
                          border: InputBorder.none,
                          hintText: 'Enter Address',
                          contentPadding:
                              EdgeInsets.only(top: 15.0, left: 15.0),
                          suffixIcon: IconButton(
                            icon: Icon(Icons.search),
                            onPressed: searchAndNavigate,
                            iconSize: 30.0,
                          )),
                      onChanged: (value) {
                        searchAddress = value;
                      },
                    ),
                  ),
                ),
              ]);
            }
          } else {
            return Center(child: CircularProgressIndicator());
          }
        }));
}

Future<Position> getCurrentLocation() async
{
var answer = await Geolocator().getCurrentPosition();
return answer;
}