gpt4 book ai didi

windows - 在 Flutter Windows 应用程序中使用 Firebase 云消息传递

转载 作者:行者123 更新时间:2023-12-05 05:44:52 27 4
gpt4 key购买 nike

我已经检查了 firebase_dart 和 flutterfire 包,但它们都没有提供要使用的 firebase FirebaseMessaging 类。有什么方法可以在我的 Flutter Windows 应用程序中使用云消息传递吗?我想从应用中的控制台监听事件并使用事件数据发送 Windows 通知。

最佳答案

我找到了一个可用的解决方法,至少目前是这样。Allysson 的回答是关于作为 Dart 管理客户端发送事件,但我想在我的 Flutter Windows 应用程序上接收消息。

解决步骤:

  1. 首先,我们必须将 Firebase“实时数据库”添加到我们的项目中 ==> firebase_dart , firebase_core , 或 firebase_dart_flutter这件事需要包裹。如果我们不开发 Flutter Windows 应用程序,则不需要 flutter 包。
  2. 准备我们的数据类以处理来自 RTDB 的传入事件:
class Message {
final String title;
final String subtitle;
final int id;
final String? url;
final String? operation;
final String? device;

@override
const Message(
{required this.title,
required this.subtitle,
required this.id,
this.url,
this.operation,
this.device});

@override
String toString() {
return 'Message{title: $title, subtitle: $subtitle, id: $id, url: $url, operation: $operation, device: $device}';
}

Map<String, dynamic> toMap() {
return {
'title': title,
'subtitle': subtitle,
'id': id,
'url': url,
'operation': operation,
'device': device,
};
}

factory Message.fromMap(Map<String, dynamic> map) {
return Message(
title: map['title'] as String,
subtitle: map['subtitle'] as String,
id: map['id'] as int,
url: map['url'] as String?,
operation: map['operation'] as String?,
device: map['device'] as String?,
);
}
}

在这个 Message 类中,我们有不可为 null 的 idtitlesubtitle 字段,它们是来自 RTDB 的静态数据结构。其他可为空的字段是可选的,我将对此进行解释。

  1. 在 RTDB 中定义我们的字段:

The fields in the Real-Time Database

正如已经指出的那样,idtitlesubtitle 字段是必需的且不可为空。 id 是一个唯一的整数,每次由我们的 Windows 客户端检查,您可以选择将最后一个 id 值保存在磁盘上,以防止在应用程序重新启动时重复通知。每次 id 在我们的数据库中发生变化时,事件都会发送给监听这个 RTDB 的客户端,然后客户端检查 id 的值是否是新的,然后发送一个通知,pub.dev 上有多个通知包。 titlesubtitle 被传递给我们的通知包的函数以实际发送通知。

  1. 收听 RTDB:

StreamSubscription? startListening() {
FirebaseDatabase db = FirebaseDatabase(
app: app,
databaseURL:
'<Our RTDB URl>');
db.goOnline();
return db.reference().onValue.listen((event) async {
final data = event.snapshot.value;
if (data != null &&
data['title'] != null &&
data['subtitle'] != null &&
data['id'] != null &&
data['title'] != '' &&
data['subtitle'] != '') {
Message message = Message.fromMap(data);
if (widget.prefs.getInt('id') != message.id) {
if (message.device == (await deviceInfo.windowsInfo).computerName ||
message.device == null) {
var toast =
LocalNotification(title: message.title, body: message.subtitle)
..show();
toast.onClick = () {
if (message.url != null) {
launchUrl(Uri.parse(message.url!));
}
};
await widget.prefs.setInt('id', message.id);
}
}
}
});
}

在上面的代码示例中,我们正在为我们的数据库创建一个对象,监听它并返回 StreamSubscription 来处理监听状态。

最后,我们将真正开始监听我们的数据库:

 StreamSubsricption? dbSub;
@override
void initState() {
super.initState();
dbSub = startListening(); //Start listening to our RTDB
}
@override
void dispose() {
dbSub?.cancel(); //Stop listening - Must be called to prevent a memory-leak
super.dispose();
}

这样,每次在 Firebase 控制台上更改 id 的值后,我们都会向 Windows 客户端发送通知,我们可以选择定义 url 字段来打开客户端点击通知时浏览器中的 URL。

关于windows - 在 Flutter Windows 应用程序中使用 Firebase 云消息传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71528238/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com