我正在使用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上提交错误来报告此断言:
作为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; }