Flutter AppLifecycleState.resumed 未检测到应用程序打开(Android onStart)

问题描述 投票:0回答:3

根据flutter AppLifecycleState文档

已恢复→应用程序可见并响应用户输入

但是似乎没有检测到应用程序打开

我已经在

AppLifecycleState
中实现了
main.dart

SystemChannels.lifecycle.setMessageHandler((msg) {
    switch (msg) {
      case 'AppLifecycleState.paused':
        {
          function...
        }
        break;
      case 'AppLifecycleState.resumed':
        {
          function...
        }
        break;
    }
    return Future.value();
  });

如何在 Flutter 中检查应用程序是否进入前台(根据简历和应用程序打开情况)?

flutter
3个回答
2
投票
  class LifeCycleManager extends StatefulWidget {
   final Widget child;
     LifeCycleManager({required this.child});

   _LifeCycleManagerState createState() => _LifeCycleManagerState();
    }

      class _LifeCycleManagerState extends State<LifeCycleManager>
         with WidgetsBindingObserver {
      
       @override
      void initState() {
       WidgetsBinding.instance!.addObserver(this);
       super.initState();
      }

     @override
    void dispose() {
    WidgetsBinding.instance!.removeObserver(this);
    super.dispose();
 }

    @override
    void didChangeAppLifecycleState(AppLifecycleState state) async {
      
     super.didChangeAppLifecycleState(state);
    if (state == AppLifecycleState.detached) {

    } else if (state == AppLifecycleState.inactive) {
 
    }
    }

    @override
   Widget build(BuildContext context) {
     return Container(
     child: widget.child,
       );
      }

使用生命周期管理器小部件包装您的主材料应用程序,在生命周期管理器中,您可以根据您的要求设置条件并执行。具体任务据此


1
投票

我不知道为什么内置的生命周期管理不提供应用程序打开事件,但我们就是这样做的。

我们定义自己的枚举来复制

AppLifecycleState
,我们添加
opened
:

/// see [AppLifecycleState] but added [opened]
enum AppState {
  opened, // <--
  resumed,
  paused,
  inactive,
  detached,
}

然后我们定义一个小部件,使用

initialState
来触发
opened
事件并使用
WidgetsBindingObserver
混合来检测其他变化。


class AppLifecycleTracker extends StatefulWidget {
  final Widget child;
  final void Function(AppState state) didChangeAppState;

  const AppLifecycleTracker({
    Key? key,
    required this.didChangeAppState,
    required this.child,
  }) : super(key: key);

  @override
  State<AppLifecycleTracker> createState() => _AppLifecycleTrackerState();
}

class _AppLifecycleTrackerState extends State<AppLifecycleTracker>
    with WidgetsBindingObserver {
  @override
  void initState() {
    super.initState();
    widget.didChangeAppState(AppState.opened);
    WidgetsBinding.instance.addObserver(this);
  }

  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    super.dispose();
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    AppState s;
    switch (state) {
      case AppLifecycleState.resumed:
        s = AppState.resumed;
        break;
      case AppLifecycleState.inactive:
        s = AppState.inactive;
        break;
      case AppLifecycleState.paused:
        s = AppState.paused;
        break;
      case AppLifecycleState.detached:
        s = AppState.detached;
        break;
    }
    widget.didChangeAppState(state);
  }

  @override
  Widget build(BuildContext context) {
    return widget.child;
  }
}

然后一定要把它添加到 widget 树的最顶部,以防止它被重新渲染(否则会再次触发

opened
事件:

runApp(
  AppLifecycleTracker(
    didChangeAppState: (state) => log(state.name),
    child: ...,
  )
);
 

0
投票

您还可以在需要时初始化和处置侦听器 用这个

class AppLifecyclePage extends StatefulWidget {
  const AppLifecyclePage({super.key});

  @override
  State<AppLifecyclePage> createState() => _AppLifecyclePageState();
}

class _AppLifecyclePageState extends State<AppLifecyclePage> {
  late final AppLifecycleListener _listener;

  @override
  void initState() {
    super.initState();

    // Pass all the callbacks for the transitions you want to listen to
    _listener = AppLifecycleListener(
      onDetach: _onDetach,
      onHide: _onHide,
      onInactive: _onInactive,
      onPause: _onPause,
      onRestart: _onRestart,
      onResume: _onResume,
      onShow: _onShow,
      onStateChange: _onStateChanged,
    );
  }

  @override
  void dispose() {
    _listener.dispose();

    super.dispose();
  }

  void _onDetach() => print('onDetach');

  void _onHide() => print('onHide');

  void _onInactive() => print('onInactive');

  void _onPause() => print('onPause');

  void _onRestart() => print('onRestart');

  void _onResume() => print('onResume');

  void _onShow() => print('onShow');

  void _onStateChanged(AppLifecycleState state) {
    // Track state changes
  }

  @override
  Widget build(BuildContext context) {
    return const Scaffold(
      body: Placeholder(),
    );
  }
}

欲了解更多信息,请查看 https://kazlauskas.dev/blog/flutter-app-lifecycle-listener-overview/

© www.soinside.com 2019 - 2024. All rights reserved.