Flutter:addPostFrameCallback 回调未调用

Slo*_*lot 6 flutter

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

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

当应用程序打开时,我检查sharedPrefs(在主要部分),如果找到重定向字符串,我将其添加到流中:

MainSingleton().notificationStream.sink.add(redirectTo);
Run Code Online (Sandbox Code Playgroud)

在我的主页中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);
        });
      }
    });
   }
Run Code Online (Sandbox Code Playgroud)

"Home page found a redirect request..."当我单击通知时,我收到了消息,但没有收到消息"Callback called",显然也没有收到重定向消息。

我需要再次将应用程序设置在后台,然后再次恢复它以获得重定向。

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

我有什么地方说错了吗?

小智 6

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

\n
MainSingleton().notificationStream.stream.listen((redirect) {\n  if (redirect != null) {\n    log(\xe2\x80\x9cHome page found a redirect request: going to $redirect\xe2\x80\x9d);\n    WidgetsBinding.instance!.addPostFrameCallback((_) {\n      log(\xe2\x80\x9cCallback called\xe2\x80\x9d);\n      Application.router.navigateTo(context, redirect);\n    });\n  }\n  WidgetsBinding.instance!.ensureVisualUpdate();\n});\n
Run Code Online (Sandbox Code Playgroud)\n

  • 非常感谢,它工作完美! (2认同)