skip to Main Content

I tried creating a class that has a factory method and use it as a singleton class . However my class needs a few constructors and doing so I always fail to write it properly

Is it possible to pass constructor and use a factory method ? I have not been able to do so.
this is the class

class LocationService {
  BuildContext context;
  late Position position;
  GeoPoint? initPosition;
  bool loadGeoFire = false;
  Function update_drivers;
  bool nearbyAvailableDriverKeysLoaded;
  bool removeDriverIcon;
  String? removeDriverKey;

  LocationService({
    required this.context,
    required this.update_drivers,
    required this.nearbyAvailableDriverKeysLoaded,
    required this.removeDriverIcon,
    required this.removeDriverKey,
    required this.initPosition,
    required this.loadGeoFire,
    // required this.position,
  });

  Future<void> locatePosition() async {
    final appData = context.read<AppData>();
    position = await Geolocator.getCurrentPosition(
        desiredAccuracy: LocationAccuracy.high);
    print("This is your Position:: " + position.toString());

    GeoPoint initPos =
        GeoPoint(latitude: position.latitude, longitude: position.longitude);

    initPosition = initPos;

    appData.initPosition = initPos;
    String address =
        // ignore: unnecessary_cast
        await (AssistantMethods.searchCoordinateAddress(position, context)
            as FutureOr<String>);
    print("This is your Address:: " + address);
    if (!loadGeoFire) {
      initializeGeoFire(
        position: position,
        update_drivers: update_drivers,
        nearbyAvailableDriverKeysLoaded: nearbyAvailableDriverKeysLoaded,
        removeDriverIcon: removeDriverIcon,
        removeDriverKey: removeDriverKey,
      );
      loadGeoFire = true;
    }
    // uName = userCurrentInfo.name;
    Provider.of<AppData>(context, listen: false).closeSplashScreen(false, true);
    AssistantMethods.retrieveHistoryInfo(context);
  }
}

I tried to do sth like this

class LocationService {
  BuildContext context;
  late Position position;
  GeoPoint? initPosition;
  bool loadGeoFire = false;
  Function update_drivers;
  bool nearbyAvailableDriverKeysLoaded;
  bool removeDriverIcon;
  String? removeDriverKey;

  static final LocationService _instance = LocationService._internal(
    context: context,
    update_drivers: update_drivers,
    nearbyAvailableDriverKeysLoaded: nearbyAvailableDriverKeysLoaded,
    removeDriverIcon: removeDriverIcon,
    removeDriverKey: removeDriverKey,
    initPosition: initPosition,
    loadGeoFire: loadGeoFire,
    position: position,
  );

  factory LocationService() {
    return _instance;
  }

  LocationService._internal({
    required this.context,
    required this.update_drivers,
    required this.nearbyAvailableDriverKeysLoaded,
    required this.removeDriverIcon,
    required this.removeDriverKey,
    required this.initPosition,
    required this.loadGeoFire,
    required this.position,
  });

won’t work though. keep getting the error The instance member 'context' can't be accessed in an initializer. Try replacing the reference to the instance member .. etc
Also do I really need to create a singleton class ? I am callinglocatePosition method from different places, read it was a good practice and want to do so.

This is how i call it from another class

 @override
  Future<void> mapIsReady(bool isReady) async {
 
     
      LocationService locationService = LocationService(
        context: context,
        update_drivers: update_drivers,
        nearbyAvailableDriverKeysLoaded: nearbyAvailableDriverKeysLoaded,
        removeDriverIcon: removeDriverIcon,
        removeDriverKey: removeDriverKey,
        initPosition: initPosition,
        loadGeoFire: loadGeoFire,
      );

// calling the locatePosition method
      await locationService.locatePosition();
    }
  }

2

Answers


  1. Chosen as BEST ANSWER

    I did it this way tho

    class LocationService {
      static LocationService? _locationService;
    
      final BuildContext context;
      final Function update_drivers;
      final bool nearbyAvailableDriverKeysLoaded;
      final bool removeDriverIcon;
      final String? removeDriverKey;
      GeoPoint? initPosition;
      bool loadGeoFire;
    
    
    
      late Position position;
    
      LocationService._({
        required this.context,
        required this.update_drivers,
        required this.nearbyAvailableDriverKeysLoaded,
        required this.removeDriverIcon,
        required this.removeDriverKey,
        required this.initPosition,
        required this.loadGeoFire,
      });
    
      factory LocationService({
        required BuildContext context,
        required Function update_drivers,
        required bool nearbyAvailableDriverKeysLoaded,
        required bool removeDriverIcon,
        required String? removeDriverKey,
        required GeoPoint? initPosition,
        required bool loadGeoFire,
      }) {
        _locationService ??= LocationService._(
          context: context,
          update_drivers: update_drivers,
          nearbyAvailableDriverKeysLoaded: nearbyAvailableDriverKeysLoaded,
          removeDriverIcon: removeDriverIcon,
          removeDriverKey: removeDriverKey,
          initPosition: initPosition,
          loadGeoFire: loadGeoFire,
        );
        return _locationService!;
      }
    

  2. It’s for sure possible to pass arguments even when using a singleton constructor in Dart.

    Here I have added positional parameters in the constructor but you can add named parameters too in it.

    Here’s the example for it:

    class LocationService {
      late BuildContext context;
      late Position position;
      late GeoPoint? initPosition;
      late bool loadGeoFire = false;
      late Function update_drivers;
      late bool nearbyAvailableDriverKeysLoaded;
      late bool removeDriverIcon;
      late String? removeDriverKey;
    
      static final LocationService _instance = LocationService._internal();
      LocationService._internal();
    
      factory LocationService(
        BuildContext context,
        Function update_drivers,
        bool nearbyAvailableDriverKeysLoaded,
        bool removeDriverIcon,
        String removeDriverKey,
        GeoPoint initPosition,
        bool loadGeoFire,
        Position position,
      ) {
        _instance.context = context;
        _instance.update_drivers = update_drivers;
        _instance.nearbyAvailableDriverKeysLoaded = nearbyAvailableDriverKeysLoaded;
        _instance.removeDriverIcon = removeDriverIcon;
        _instance.removeDriverKey = removeDriverKey;
        _instance.initPosition = initPosition;
        _instance.loadGeoFire = loadGeoFire;
        _instance.position = position;
        return _instance;
      }
    }
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search