即使在打开和关闭应用程序后,也可以使用flutter将通知徽章保留在应用程序图标上吗?例如:用户的徽章值为6,打开应用程序以读取一条消息,关闭应用程序,徽章现在为5。
如何实现此功能? (专门寻找iOS解决方案,如果您有提示,也希望了解Android方面的信息)
答案 0 :(得分:1)
实现此目的的一种方法是使用 flutter_app_badger 包,它允许您使用 updateBadgeCount
函数设置应用徽章。诀窍是,在应用程序置于后台或关闭之前,当您的应用程序处于前台时,您需要至少调用一次此函数。一种方法是在小部件树顶部的一个小部件中扩展 WidgetsBindingObserver
并覆盖 didChangeAppLifecycleState
:
class HomeScreen extends StatefulWidget {
@override
State<StatefulWidget> createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> with WidgetsBindingObserver {
@override
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
switch (state) {
case AppLifecycleState.resumed:
print("app in resumed");
if (PushNotificationsManager.appBadgeSupported) {
FlutterAppBadger.updateBadgeCount(14);
}
break;
case AppLifecycleState.inactive:
print("app in inactive");
break;
case AppLifecycleState.paused:
print("app in paused");
break;
case AppLifecycleState.detached:
print("app in detached");
break;
}
}
}
应用程序标志不会自行保留,这就是为什么每次您的应用程序在前台时都需要至少调用一次此函数的原因,而在 didChangeAppLifecycleState
中执行此操作的好地方是 {{1 }} 变化。如果您像上面一样在 AppLifecycleState
状态下调用 updateBadgeCount
,您还需要在应用程序启动时调用一次 AppLifecycleState.resumed
(您可以在 PushNotificationsManager 等类的 init 函数中执行此操作如果你有一个,否则就在你的一个小部件 init 函数中进行)。
您还可以将 updateBadgeCount
置于其他状态,例如 updateBadgeCount
或 AppLifecycleState.inactive
,这在大多数情况下都有效,但对此要谨慎,因为如果应用程序在没有非活动或暂停状态触发,则应用徽章将不会更新,因为 AppLifecycleState.paused
函数未被调用。
为了完整性:当您的应用程序关闭或在后台时,您可以使用 Apple 推送通知服务更新您的应用程序徽章。在负载中包含徽章编号,如 here 所示。然后当用户打开你的应用程序时,上面的代码将执行,并且徽章编号将再次更新,以便当用户关闭应用程序或应用程序进入后台时,徽章编号将“保持”如用户所见。
详细了解 WidgetsBindingObserver 以及如何检测应用是否处于前台/后台 here。
答案 1 :(得分:0)
您可以使用flutter_app_badger控制徽章图标。
您可以在AppLifecycleState
为inActive
时设置badge的值。
import 'package:flutter_app_badger/flutter_app_badger.dart';
class HogeState extends State<Hoge> with WidgetsBindingObserver {
@override
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
if (state == AppLifecycleState.inactive) {
_inActive();
}
super.didChangeAppLifecycleState(state);
}
void _inActive() {
FlutterAppBadger.updateBadgeCount([value of badge]);
}
}