Flutter Local Notifications and Cloud Firestore Queries in the BACKGROUND

https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmmmq4nvrzaq4zr05lk5a.png

––– views

2 mins

9 May 2021

https://media.giphy.com/media/LmNwrBhejkK9EFP504/giphy.gif
So a project i’ve been working on recently needed a module where i had to receive user notifications in the background and also refresh user’s info as soon as the notification was delivered to a user .
Now, this could’ve been done using the cloud function we were using to send the notification. but we needed to refresh the data only when the user received notification.
so LESGOOOOOOOO!
https://media.giphy.com/media/S5yqNNTQlEZfqQ7InC/giphy.gif
the plugins we’ll need:
flutter_local_notifications: cloud_store: firebase_messaging:
make sure you’ve set these up before proceeding
run the app once and find the **GeneratedPluginRegistrant.java **file in android/app/src/main/java/io/flutter/plugins. we’ll need these to identify the import names later.
now head over to the folder containing **MainActivity.kt **and here we’ll create a registrant class.
CloudFirestorePluginRegistrant.kt
package <com.your.application> import android.util.Log import io.flutter.plugin.common.PluginRegistry import io.flutter.plugins.firebase.cloudfirestore.CloudFirestorePlugin class CloudFirestorePluginRegistrant { companion object { fun registerWith(registry: PluginRegistry){ Log.d("CloudFirestore", "registerWith"); if(alreadyRegisteredWith(registry)) { Log.d("Already Registered",""); return } try { CloudFirestorePlugin.registerWith(registry.registrarFor("io.flutter.plugins.firebase.cloudfirestore.CloudFirestorePlugin")) } catch (e: Exception) { Log.d("CloudFirestore", e.toString());} Log.d("Plugin Registered",""); } private fun alreadyRegisteredWith(registry: PluginRegistry): Boolean { val key = CloudFirestorePluginRegistrant::class.java.canonicalName if (registry.hasPlugin(key)) { return true } registry.registrarFor(key) return false } } }
and now lets register this class in our **Application.kt **in the same folder
package <com.your.application> import io.flutter.app.FlutterApplication import io.flutter.plugin.common.PluginRegistry import com.your.application.CloudFirestorePluginRegistrant class Application : FlutterApplication(), PluginRegistry.PluginRegistrantCallback { override fun onCreate() { super.onCreate() } override fun registerWith(registry: PluginRegistry?) { if (registry != null) { CloudFirestorePluginRegistrant.registerWith(registry) }} }
and thats about it.
Note: remember to omit “notification” key from our payload to trigger onBackgroundMessage callback.
now we can simply call this code in our firebase messaging onBackgroundMessage callback:
onBackgroundMessage: _onMyBackGroundMessage; _onMybackGroundMessage(Map<String,dynamic> message){ firestore.instance.collection(message['data'['userName']) .document(notfication).set({name:['data']['userName]}); }
and now we can make cloud firestore queries even if the app is in background.
https://media.giphy.com/media/SACoDGYTvVNhZYNb5a/giphy.gif

Not Playing

Made with nextjs and ❤