Flutter: Push notifications even if the app is closed

后端 未结 5 1194
长情又很酷
长情又很酷 2020-12-02 13:17

I have built an application with flutter that works like a reminder.
How can I display notifications to the user even though the app is closed?

5条回答
  •  小蘑菇
    小蘑菇 (楼主)
    2020-12-02 14:12

    I have found a solution to this problem. We just have to register the Local Notification Plugin in the Application class.

    First Create a class FlutterLocalNotificationPluginRegistrant, I have created this in Kotlin.

    class FlutterLocalNotificationPluginRegistrant {
    
    companion object {
        fun registerWith(registry: PluginRegistry) {
            if (alreadyRegisteredWith(registry)) {
                Log.d("Local Plugin", "Already Registered");
                return
            }
            FlutterLocalNotificationsPlugin.registerWith(registry.registrarFor("com.dexterous.flutterlocalnotifications.FlutterLocalNotificationsPlugin"))
            Log.d("Local Plugin", "Registered");
        }
    
        private fun alreadyRegisteredWith(registry: PluginRegistry): Boolean {
            val key = FlutterLocalNotificationPluginRegistrant::class.java.canonicalName
            if (registry.hasPlugin(key)) {
                return true
            }
            registry.registrarFor(key)
            return false
        }
    }}
    

    Now create a Application class extending FlutterApplication and implement PluginRegistry.PluginRegistrantCallback.

    class Application : FlutterApplication(), PluginRegistry.PluginRegistrantCallback {
    
    override fun onCreate() {
        super.onCreate()
    }
    
    override fun registerWith(registry: PluginRegistry?) {
        if (registry != null) {
            FlutterLocalNotificationPluginRegistrant.registerWith(registry)
        }
    }}
    

    and register the Application class in the AndroidManifest.xml

    
    

    All done. Now write a function to show notification and call it from the background handler method of Firebase messaging.

        Future _showNotificationWithDefaultSound(String title, String message) async {
      var androidPlatformChannelSpecifics = AndroidNotificationDetails(
          'channel_id', 'channel_name', 'channel_description',
          importance: Importance.Max, priority: Priority.High);
      var iOSPlatformChannelSpecifics = IOSNotificationDetails();
      var platformChannelSpecifics = NotificationDetails(
          androidPlatformChannelSpecifics, iOSPlatformChannelSpecifics);
       await flutterLocalNotificationsPlugin.show(
        0,
        '$title',
        '$message',
        platformChannelSpecifics,
        payload: 'Default_Sound',
      );
    }
    

    and call it like this.

        Future myBackgroundMessageHandler(Map message) async {
    
      if (message['data'] != null) {
        final data = message['data'];
    
        final title = data['title'];
        final body = data['message'];
    
        await _showNotificationWithDefaultSound(title, message);
      }
      return Future.value();
    }
    

提交回复
热议问题