一尘不染

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

flutter

我正在使用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 /颤振(14143):

I / flutter(14143):要么断言表明框架本身存在错误,要么我们应该提供

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

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


阅读 402

收藏
2020-08-13

共1个答案

一尘不染

作为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;
}
2020-08-13