我用颤动构建了一个应用程序,就像提醒一样。
即使该应用已关闭,如何向用户显示通知?
答案 0 :(得分:11)
我找到了解决此问题的方法。我们只需要在Application类中注册本地通知插件即可。
首先创建一个FlutterLocalNotificationPluginRegistrant类,我已经在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
}
}}
现在创建一个扩展FlutterApplication的Application类,并实现PluginRegistry.PluginRegistrantCallback。
class Application : FlutterApplication(), PluginRegistry.PluginRegistrantCallback {
override fun onCreate() {
super.onCreate()
}
override fun registerWith(registry: PluginRegistry?) {
if (registry != null) {
FlutterLocalNotificationPluginRegistrant.registerWith(registry)
}
}}
并在AndroidManifest.xml中注册Application类
<application
android:name="com.packagename.Application"/>
全部完成。现在,编写一个显示通知的函数,并从Firebase消息传递的后台处理程序方法中调用它。
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',
);
}
并这样称呼它。
Future<dynamic> myBackgroundMessageHandler(Map<String, dynamic> message) async {
if (message['data'] != null) {
final data = message['data'];
final title = data['title'];
final body = data['message'];
await _showNotificationWithDefaultSound(title, message);
}
return Future<void>.value();
}
答案 1 :(得分:5)
为提醒起见,我建议使用Flutter Local Notifications Plugin。它具有强大的调度API。从本地通知的文档中:
安排应在何时出现通知-定期显示 通知(基于时间间隔)-安排要显示的通知 每天在指定时间-安排每周显示一次通知 在指定的日期和时间-当应用程序是前台,后台或终止
时,当用户点击通知时的功能
对于推送通知,您可以使用Firebase Cloud Messaging 或one signal插件,也可以通过platform-channels
本地实现编辑:即使应用终止,您也可以根据特定条件触发通知。这可以通过在后台运行飞镖代码来解决。引用官方常见问题解答:
我可以在Flutter应用程序的后台运行Dart代码吗?是的你可以 在iOS和Android上的后台进程中运行Dart代码。对于 有关更多信息,请参见中型文章Executing Dart in the Background with Flutter Plugins and Geofencing.
答案 2 :(得分:1)
我也遇到了这个问题,所以这些是我的经验教训
在我的情况下:我可以在App继续状态或App后台状态下收到通知,但是在App关闭状态下,我没有收到通知。
在这种情况下,我们的通知正文为:
{notification: {body: null, title: null}, data: {body: hello, title: world}}
要在“应用关闭”状态下接收通知,我们将通知更改为
{notification: {body: abc, title: abc}, data: {url: string, body: string, title: string}}
答案 3 :(得分:0)
您可以快速使用计划的通知。
for each_value in table:
if each_value[0] == x:
print("Yeah! Find: {0}".format(each_value[0]))
break
答案 4 :(得分:0)
firebase_messaging官方flutter插件支持显示通过FCM发送的通知。 最近在v5.1.5中,他们增加了对andriod的后台消息处理的支持。