我怎样才能让我的更改通知程序触发我的警报对话框?

How can I have my change notifier trigger my alert dialog?

我有一个通知服务,它是一个更改通知程序。当服务收到通知时,它会通知所有侦听器。我想在收听者收到通知时显示一个对话框。所以我在构建方法中执行以下操作

    Consumer<NotificationService>(
        builder: (BuildContext context, NotificationService notificationNotifier, _) {
            if (notificationNotifier.hasNotifications)  
                _showNotification(context, notificationNotifier.popNotification());
            return Scaffold(

这是显示的通知方法

  Future<dynamic> _showNotification(BuildContext context, NotificationModel notification) async {
    try {
      print(notification.title);
      await PlatformAlertDialog(
        notification.title,
        notification.body,
      ).show(context);
    } on UserFriendlyException catch (error) {
      await PlatformAlertDialog(
        error.title,
        error.message,
      ).show(context);
    }
  }

所以这会引发错误,因为我想在构建对话框时构建对话框 Unhandled Exception: setState() or markNeedsBuild() called during build.

我喜欢使用更改通知程序提供程序。那么我怎样才能使它起作用呢?

可以使用Flutter的SchedulerBinding.instance Api来防止这个异常。发生此错误是因为在构建构建方法之前,您调用了一个对话框,该对话框将阻止重建完成。

所以没有报错:

Consumer<NotificationService>(
        builder: (BuildContext context, NotificationService notificationNotifier, _) {
            if (notificationNotifier.hasNotifications){  
                 SchedulerBinding.instance.addPostFrameCallback((_) =>  
               _showNotification(context, notificationNotifier.popNotification()));
               }
            return Scaffold(

但是,Flutter 文档建议您不要在构建方法中执行函数。这可能有副作用。 由于对话框需要的上下文,您可能正在使用这种方法。我建议看看这个插件:

https://pub.dev/packages/get

有了它,您可以从代码中的任何位置打开对话框,而无需上下文,而且它的状态管理器比 changeNotifier 更容易,但性能还不错。

根据文档,changeNotifier 必须用于一个或最多两个侦听器。他的性能很差,和这个插件很像,但是不使用changeNotifier,相信会让你的项目更进化一点。

https://api.flutter.dev/flutter/foundation/ChangeNotifier-class.html