didChangeAppLifecycleState不能按预期工作

12

我希望我能正确理解didChangeAppLifecycleState的工作原理。

我有A页面和B页面。当我从B页面点击返回设备按钮(Navigator.of(context).pop();)时,我期望在A页面中didChangeAppLifecycleState会被调用,但实际上并没有。

PageA

class _ABCState extends State<ABCrList> 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.resumed) {
      setState(() {
        print(...);
      });
    }else{
      print(state.toString());
    }
  }

....

这是页面A中的initState。该函数用于调用后端服务。

@override
  void initState() {
    super.initState();  
       _bloc.getList(context);  // return list and populate to ListView
    });
  }
1个回答

15
你目前的想法是按照Android的方式进行,其中onResume能够起作用。但是在Flutter中,事情不是这样发生的。
通常情况下,当系统将应用程序置于后台或将其返回到前台时,会调用此方法。
它主要有4种状态: resumed: 应用程序可见并能够响应用户输入。 inactive: 应用程序处于非活动状态,不接收用户输入。 paused: 应用程序当前不可见,无法响应用户输入,并在后台运行。 detached: 应用程序仍托管在Flutter引擎上,但已与任何宿主视图分离。
编辑:
当从PageA导航到PageB时,请使用以下内容:
Navigator.pushNamed(context, "/pageB").then((flag) {
  if (flag) {
    // you're back from PageB, perform your function here
    setState(() {}); // you may need to call this if you want to update UI
  }
});

从PageB,您将可以使用

Navigator.pop(context, true);

那么,如果我想在页面B中按下后退设备按钮后调用一个函数,我应该把它放在哪里? - Tony
你可以在PageA中使用Navigator.push().then(_) - CopsOnRoad
从PageB页面,您将执行Navigator.pop(true),在PageA中,您可以获取它的值,该值在上面的代码中表示为_ - CopsOnRoad
你能再检查一下我的帖子吗?我已经更新了它。目前 getList 函数会在页面第一次加载时被调用。当从页面B返回时,我该如何再次调用这个函数呢? - Tony
谢谢,通过跟随您的代码,我可以看到函数再次被调用。但是为什么数据没有填充到listView中呢? - Tony
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接