Home > database >  Assign Future<var> to var
Assign Future<var> to var

Time:05-23

I have some code written in dart where I use the provider package to update the location of a pin on a map. What I would like it to do is have the initial location be equal to the user's current position and then if they drag the pin it will be updated to wherever the pin is dropped.

My problem is that the initial location variable needs to Future<LatLng>, however, when I update the location it ends up being just LatLng and I cannot assign it to the _location variable.

class LocationProvider with ChangeNotifier {
  Future<LatLng> _location = LocationService().getLocation();

  // Error here, wants it to be Future<LatLng>
  LatLng get location => _location; 

  void calculateNewLocation(oldLocation, zoom, offset) {
    var newPoint = const Epsg3857().latLngToPoint(oldLocation, zoom)  
        CustomPoint(offset.dx, offset.dy);
    LatLng? newLocation = const Epsg3857().pointToLatLng(newPoint, zoom);

    // Error here again for the same reason
    _location = newLocation ?? _location;

    notifyListeners();
  }
}

How do I make it so that I can assign both of these values to _location?

CodePudding user response:

You can simply have a method for that in provider file

class LocationProvider with ChangeNotifier {
  LatLng? _location;

  LatLng? get location => _location; 

  void initializeLocation() async {
    _location = await LocationService().getLocation();
    notifyListeners();
  }

  void calculateNewLocation(oldLocation, zoom, offset) {
    var newPoint = const Epsg3857().latLngToPoint(oldLocation, zoom)  
        CustomPoint(offset.dx, offset.dy);
    LatLng? newLocation = const Epsg3857().pointToLatLng(newPoint, zoom);

    _location = newLocation ?? _location;

    notifyListeners();
  }
}

Then, you'll have to call initializeLocation when you want it to be initialized, like:

final _provider = Provider.of<LocationProvider>(listen: false);
_provider.initializeLocation();

PS: ? can be excluded if you're not using dart in null safe mode

CodePudding user response:

Based on your code,

LocationService().getLocation() returns a future, so you have to either await/async or use then().

try these

Future<LatLng> _location = LocationService().getLocation();
LatLng get location = await _location;  // put this in a separate method with async keyword

or

LocationService().getLocation().then((value) { location = value } ); 
  • Related