How to send user location to Firestore even when app is killed in flutter?

484

I found the problem. I need to add Firestore code in the callback instead of in the ReceivePort. Here is the working code:

Future<void> _startLocator() async {
    final Map<String, dynamic> data = {'countInit': 1};
    return BackgroundLocator.registerLocationUpdate(
        LocationCallbackHandler.callback, // <-- You need to add your callback code here
        initCallback: LocationCallbackHandler.initCallback,
        initDataCallback: data,
        disposeCallback: LocationCallbackHandler.disposeCallback,
        iosSettings: const IOSSettings(
            accuracy: location_settings.LocationAccuracy.BALANCED,),
        androidSettings: AndroidSettings(
            accuracy: location_settings.LocationAccuracy.BALANCED,
            interval: 5,
            androidNotificationSettings: AndroidNotificationSettings(
                notificationChannelName: 'Location tracking',
                notificationTitle:
                    location.isNotEmpty ? location : 'Start Location Tracking',
                notificationMsg: 'Track location in background',
                notificationBigMsg:
                    'Background location is on to keep the app up-to-date with your location. This is required for main features to work properly when the app is not running.',
                notificationIconColor: Colors.grey,
                notificationTapCallback:
                    LocationCallbackHandler.notificationCallback)));
  }
Future<void> callback(LocationDto locationDto) async {
   // Your call back code goes here
}
Share:
484
Zeeshan Ahmad
Author by

Zeeshan Ahmad

Updated on December 31, 2022

Comments

  • Zeeshan Ahmad
    Zeeshan Ahmad over 1 year

    I am trying to send user's location to Firestore even when the app is killed. I'm successfully able to send data to Firestore when the app is in the foreground or background but unable to send data when the app is killed. Can anyone explain what could be the problem?

    I'm using

    background_locator: ^1.6.4
    

    Flutter

    Flutter 2.2.3 • channel stable • https://github.com/flutter/flutter.git
    Framework • revision f4abaa0735 (2 weeks ago) • 2021-07-01 12:46:11 -0700
    Engine • revision 241c87ad80
    Tools • Dart 2.13.4
    

    Dart

    Dart SDK version: 2.13.4 (stable) (Wed Jun 23 13:08:41 2021 +0200) on "linux_x64"
    

    This code that I'm trying to execute once data is received

    receiverPort.listen(
          (dynamic data) async {
            if (data != null) {
              WidgetsFlutterBinding.ensureInitialized();
              await Firebase.initializeApp();
              final LocationDto position = data as LocationDto;
              print('data: $position');
    
              final Member member = await FirebaseService().getCurrentUserProfile();
              member.currentPosition = '${position.latitude},${position.longitude}';
              await FirebaseService()
                  .updateData(
                      FirebaseService.memberRef,
                      FirebaseService.memberChildId,
                      FirebaseService.getCurrentUserId(),
                      member.toJson())
                  .then((value) {});
            } else {
              print('data is null');
            }
          },
        );
    

    Please let me know if I need to share anything else. Thanks