如何检查Flutter应用程序是否在前台?

时间:2018-08-14 06:32:28

标签: dart flutter

我不想在前台运行应用程序时显示通知。 我如何查看我的应用程序的实时状态?

6 个答案:

答案 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
}