首页 > 解决方案 > 在 sqflite 颤振中保存收到的推送通知

问题描述

我已被分配在 sqflite 中保存收到的前台和后台推送通知。我能够保存从 flutter_local_notification 包生成的前台通知,但无法在前台和后台保存从 firebase_messaging 收到的通知。
请指导我解决这个问题。

编辑-我已经通过添加SqflitePlugin.registerWith(registry!!.registrarFor("com.tekartik.sqflite.SqflitePlugin"));上面的 FirebaseMessagingPlugin 解决了这个问题。下面是完整的代码

应用程序.kt

import io.flutter.app.FlutterApplication
import io.flutter.plugin.common.PluginRegistry
import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback
import io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin
import io.flutter.view.FlutterMain
import io.flutter.plugins.GeneratedPluginRegistrant
import io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService
import com.dexterous.flutterlocalnotifications.FlutterLocalNotificationsPlugin
import com.tekartik.sqflite.SqflitePlugin

class Application : FlutterApplication(), PluginRegistrantCallback {

    override fun onCreate() {
        super.onCreate()

        FlutterFirebaseMessagingService.setPluginRegistrant(this);
        FlutterMain.startInitialization(this)
    }

    override fun registerWith(registry: PluginRegistry?) {

        if (!registry!!.hasPlugin("io.flutter.plugins.firebasemessaging")) {
            SqflitePlugin.registerWith(registry!!.registrarFor("com.tekartik.sqflite.SqflitePlugin"));
            FirebaseMessagingPlugin.registerWith(registry!!.registrarFor("io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin"));
        }
        if (!registry!!.hasPlugin("com.dexterous.flutterlocalnotifications")) {
            FlutterLocalNotificationsPlugin.registerWith(registry!!.registrarFor("com.dexterous.flutterlocalnotifications.FlutterLocalNotificationsPlugin"));
        }

MainActivity.kt

import io.flutter.embedding.android.FlutterActivity
import androidx.annotation.NonNull;
import io.flutter.embedding.android.FlutterFragmentActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugins.GeneratedPluginRegistrant



class MainActivity: FlutterFragmentActivity() {
    override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
        GeneratedPluginRegistrant.registerWith(flutterEngine);

    }
}

然后在清单文件中注册 Application.kt

标签: flutterpush-notificationsqflite

解决方案


您必须包含data在您的消息中。在后台和前台进行解释。在onMessage设置的末尾,分号之前,在.onData({write your logic here});

import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_messaging/firebase_messaging.dart';

Future<void> firebaseMessagingBackgroundHandler(RemoteMessage message) async {
  if (Firebase.apps.isEmpty) await Firebase.initializeApp();


  print('Got a message whilst in the BACKGROUND or TERMINATED!');

  if (message.notification != null) {
    print(
        'Message also contained a notification, with the following:\nTitle: ${message.notification?.title}\nBody: ${message.notification?.body}');
  }
}

handleNotifications() async {
  FirebaseMessaging messaging = FirebaseMessaging.instance;
  NotificationSettings status = await messaging.getNotificationSettings();
  if (!(status.authorizationStatus == AuthorizationStatus.authorized) ||
      status.authorizationStatus == AuthorizationStatus.notDetermined) {
    NotificationSettings settings = await messaging.requestPermission(
        alert: true, announcement: false, badge: true, carPlay: false, provisional: true, sound: true);
    if (settings.authorizationStatus == AuthorizationStatus.authorized) {
      print('user granted permissions');
    }
  }

  FirebaseMessaging.instance.setForegroundNotificationPresentationOptions(badge: true, alert: true, sound: true);
  FirebaseMessaging.onMessage.listen((message) async {
    print(' Got a message whilst in the FOREGROUND! ');

    if (message.notification != null) {
      print(
          'Message also contained a notification, with the following:\nTitle: ${message.notification?.title}\nBody: ${message.notification?.body}');
    }

    return;
  }).onData((data) {
    //do your sqflite or any other logic here
    print('data from stream: ${data.data}');
  });

  FirebaseMessaging.onMessageOpenedApp.listen((message) async {
    print('NOTIFICATION MESSAGE TAPPED');
    print('Message data: ${message.data}');

    if (message.notification != null) {
      print(
          'Message also contained a notification, with the following:\nTitle: ${message.notification?.title}\nBody: ${message.notification?.body}');
    }

    return;
  }).onData((data) {
    //do your sqflite or any other logic here
    print('data from stream: ${data.data}');
  });

  FirebaseMessaging.onBackgroundMessage(firebaseMessagingBackgroundHandler);

  return;
}

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  handleNotifications();
  runApp(MyApp());
}

推荐阅读