【问题标题】:Save recieved push notifications in sqflite flutter在 sqflite 颤振中保存收到的推送通知
【发布时间】:2021-06-28 06:53:56
【问题描述】:

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

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

Application.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);

    }
}

然后在 Manifest 文件中注册 Application.kt

【问题讨论】:

    标签: flutter push-notification sqflite


    【解决方案1】:

    您必须在消息中包含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());
    }
    

    【讨论】:

    • 我添加了一个完整的工作代码示例,请查看。按原样放置它们,在Main 上方然后void main()
    • 我正在使用 firebase_messaging:^7.0.3。正如你所说,我已经将代码放在了上面,但它在代码的某些部分显示了红线。我想你可能使用不同版本的 firebase_messaging
    • 这是使用 9.0 版。如果您有红线,请使用您当前的设置,并实现onData 函数,这就是发布代码的想法。我用sqflite logic评论了他们。
    • 当我输入“FirebaseMessaging”时。唯一可用的方法是点后的“私有”。我看不到其他方法,例如上述代码中的“FirebaseMessaging.onMessage”。创建对象后,我可以像在此链接link 中那样访问 .configure 方法。现在我可以保存前台消息,但不能保存后台收到的消息。
    猜你喜欢
    • 2020-06-26
    • 2021-11-04
    • 2021-12-28
    • 1970-01-01
    • 2018-03-16
    • 1970-01-01
    • 2020-06-28
    • 2021-09-14
    相关资源
    最近更新 更多