首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >颤振AppLifecycleState.resumed没有检测到应用程序打开(Android onStart)

颤振AppLifecycleState.resumed没有检测到应用程序打开(Android onStart)
EN

Stack Overflow用户
提问于 2022-01-08 12:27:59
回答 2查看 1.1K关注 0票数 1

根据颤振AppLifecycleState文档

恢复→应用程序是可见的,并响应用户输入

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

我已经在AppLifecycleState中实现了main.dart

代码语言:javascript
运行
复制
SystemChannels.lifecycle.setMessageHandler((msg) {
    switch (msg) {
      case 'AppLifecycleState.paused':
        {
          function...
        }
        break;
      case 'AppLifecycleState.resumed':
        {
          function...
        }
        break;
    }
    return Future.value();
  });

如何检查应用程序是否在颤振中成为前台(基于简历和应用程序打开)?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-08-18 20:45:54

我不知道为什么内置的生命周期管理不提供一个应用程序开放事件,但这是我们如何做到的。

我们定义了我们自己的枚举,它复制了添加AppLifecycleStateopened

代码语言:javascript
运行
复制
/// see [AppLifecycleState] but added [opened]
enum AppState {
  opened, // <--
  resumed,
  paused,
  inactive,
  detached,
}

然后,我们定义一个小部件,它使用initialState触发opened事件,并使用WidgetsBindingObserver混合来检测其他更改。

代码语言:javascript
运行
复制
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;
  }
}

然后,一定要将其添加到小部件树的最顶端,以防止其重新呈现(否则它将再次触发opened事件:

代码语言:javascript
运行
复制
runApp(
  AppLifecycleTracker(
    didChangeAppState: (state) => log(state.name),
    child: ...,
  )
);
票数 1
EN

Stack Overflow用户

发布于 2022-01-08 12:34:20

代码语言:javascript
运行
复制
  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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70632297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档