下面的代码(Flutter)中是否有解决同步问题的方法?

cuxqih21  于 2023-05-08  发布在  Flutter
关注(0)|答案(1)|浏览(140)

我在Flutter中开发了一个使用谷歌Map的应用程序。现在我通过调用'rh.populateStations()'获取坐标数组,在googleMap上显示标记。现在我还必须通过请求用户的许可来获取用户的位置,然后将其添加到上面的数组中,然后调用'fillMarkers'函数来显示所有这些位置上的标记。代码如下:

Future<Position> getUserCurrentLocation() async {
    try {
      await Geolocator.requestPermission();
    } catch (e) {
      print("Error occurred while requesting permission");
    }
    Position position = await Geolocator.getCurrentPosition();
    return position;
}

Future<void> loadData() async {

    await rh.populateStations();
    locationsToDisplay.addAll(rh.stations);
    Position position = await getUserCurrentLocation();
    print("Current location obtained: $position");

    userLoc = StopLocation(LatLng(position.latitude, position.longitude), 'My StopLocation', false, false, false, true);
    start = userLoc;
    start?.isStartingPoint = true;
    locationsToDisplay.insert(0, userLoc!);
    setState(() {
      fillMarkers();
    });
}

 @override
  void initState() {
    super.initState();
     loadData();
    // loadData().then((_) {
    //   setState(() {
    //     fillMarkers();
    //   });
    // });
 }

现在的问题是,我认为由于同步问题时,系统要求的权限,它显示在屏幕上的错误'RangeError(开始):无效值:只有有效值为0:1参见:https://flutter.dev/docs/testing/errors'。给予许可后,红色屏幕消失,标记显示。现在我想摆脱这个红色的屏幕,这是在请求许可时出现的。
我认为问题是fillmarks函数在没有获取数据时被调用,所以这就是为什么它给出错误(可能是我错了)。所以请帮我解决这个问题。

vdgimpew

vdgimpew1#

bool isLoading=false;

Future<Position> getUserCurrentLocation() async {
// get user position
}

Future<void> loadData() async {
// init loading flag to true
setState(() {
  isLoading=true;
});
// load all data
// change loading flag to false
setState(() {
  isLoading=false;
});
}

@override
 void initState() {
  super.initState();
  loadData();    
 }
@override
 Widget build(BuildContext context) {     
  return isLoading? CircularProgressIndicator():YOURWIDGET;
 }

通过这样做,你可以避免,如果任何部件试图访问数组之前,它是初始化

相关问题