Flutter:addPostFrameCallback回调未被调用。

6

我尝试实现一个重定向系统。

如果我的应用程序在后台接收到来自Firebase消息的通知,我会将发送路由信息(例如:redirect = /medias/details/430)存储在共享首选项中。

当应用程序打开时,在主要代码中检查sharedPrefs并且如果找到重定向字符串,则将其添加到流中:

MainSingleton().notificationStream.sink.add(redirectTo);

在我的首页的initState中,我检查流中是否有重定向,如果是这种情况,我会使用以下方式将用户重定向到正确的页面:
  void initState() {
    super.initState();

    MainSingleton().notificationStream.stream.listen((redirect) {
      if (redirect != null) {
        log("Home page found a redirect request: going to $redirect");
        WidgetsBinding.instance!.addPostFrameCallback((_) {
          log("Callback called");
          Application.router.navigateTo(context, redirect);
        });
      }
    });
   }

当我点击通知时,收到了消息"主页发现重定向请求...",但没有收到"回调被调用",显然也没有进行重定向。

我需要再次将应用程序置于后台,并恢复它第二次才能获得重定向。

WidgetsBinding.instance不为null,所以我不知道为什么没有调用回调。

我哪里错了吗?

1个回答

6

我不知道它是否是一个好的解决方案或只是一个权宜之计,但你可以使用 WidgetsBinding.instance!.ensureVisualUpdate 来安排一个新的帧,因为你的应用程序可能当前不会生成任何进一步的帧,导致 addPostFrameCallback 永远不会被调用。

MainSingleton().notificationStream.stream.listen((redirect) {
  if (redirect != null) {
    log(“Home page found a redirect request: going to $redirect”);
    WidgetsBinding.instance!.addPostFrameCallback((_) {
      log(“Callback called”);
      Application.router.navigateTo(context, redirect);
    });
  }
  WidgetsBinding.instance!.ensureVisualUpdate();
});

2
非常感谢,它完美地运行! - Slot
我遇到了相同的问题-我无法让addPostFrameCallback触发。还尝试添加ensureVisualUpdate,但仍然无法触发。不确定为什么。最终我使用了'after_layout'包,在第一个布局完成后触发调用:https://github.com/fluttercommunity/flutter_after_layout另请参阅此处:https://dev59.com/olUM5IYBdhLWcg3wAsfv - VincentH

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