我不想在前台运行应用程序时显示通知。 我如何查看我的应用程序的实时状态?
答案 0 :(得分:24)
要扩展上述答案,您可以使用switch语句使其简洁明了:
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
switch(state){
case AppLifecycleState.resumed:
print("app in resumed");
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;
}
}
答案 1 :(得分:4)
在您的State <...>类中,您需要实现WidgetsBindingObserver接口并侦听小部件状态更改。像这样:
class _MyHomePageState extends State<MyHomePage> with WidgetsBindingObserver {
AppLifecycleState _notification;
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
setState(() {
_notification = state;
});
}
@override
initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
...
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
}
然后,当您想知道什么是状态时,请检查_notification.index属性。 _notification == null =>没有状态更改发生,0-恢复,1-无效,2-暂停。
答案 2 :(得分:1)
只需创建一个bool
变量即可跟踪您的所有背景/前景。
完整代码:
class _HomePageState extends State<HomePage> with WidgetsBindingObserver {
// This variable will tell you whether the application is in foreground or not.
bool _isInForeground = true;
@override
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
super.didChangeAppLifecycleState(state);
_isInForeground = state == AppLifecycleState.resumed;
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
@override
Widget build(BuildContext context) => Scaffold();
}
答案 3 :(得分:0)
我的答案可能迟到了,但可能对某人有所帮助。我也遇到了这个问题,有一个可以在 android 和 ios
上运行的插件https://pub.dev/packages/flutter_app_lock
您可以在其中放置所需锁屏的地方也非常灵活。
希望像我这样坚持的人可以轻松完成这项工作。
答案 4 :(得分:0)
还有一个名为 flutter_fgbg 的包。
示例:
FGBGNotifier(
onEvent: (event) {
print(event); // FGBGType.foreground or FGBGType.background
},
child: ...,
)
或者:
subscription = FGBGEvents.stream.listen((event) {
print(event); // FGBGType.foreground or FGBGType.background
});
// in dispose
subscription.cancel();
Why:
<块引用>Flutter 具有 WidgetsBindingObserver 以在应用程序更改时收到通知 它的状态从活动状态到非活动状态并返回。但其实 包括嵌入 Activity/ViewController 的状态更改为 好。所以如果你有一个插件可以打开一个新的活动/视图 控制器(例如:图像选择器)或在 iOS 中,如果您启动 FaceID 提示 然后 WidgetsBindingObserver 将报告为应用程序 不活动/已恢复。
另一方面,此插件仅在应用级别报告事件。 由于大多数应用程序只需要后台/前台事件,所以这个插件是 仅通过这些事件实现。在 iOS 中,插件报告 didEnterBackgroundNotification 和 willEnterForegroundNotification 通知和在 Android 中,插件报告这些使用 androidx.lifecycle:lifecycle-process 包。
查看示例/项目以查看操作差异。
示例 link。
答案 5 :(得分:0)
您可以使用全局变量来保存状态以方便使用。
例如:
AppLifecycleState appLifecycleState = AppLifecycleState.detached;
在您的 AppState
中保存状态:
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
appLifecycleState = state;
}
现在您可以在需要时轻松使用它:
if (appLifecycleState == AppLifecycleState.paused) {
// in background
}