Как можно, чтобы мой уведомитель об изменениях вызывал мой диалог предупреждений? - PullRequest
0 голосов
/ 04 мая 2020

У меня есть служба уведомлений, которая является уведомителем об изменениях. Когда служба получает уведомление, она уведомляет всех подписчиков. Я хочу отобразить диалоговое окно, когда подписчики получают уведомление. Таким образом, я делаю следующее в моем методе сборки

    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.

Мне нравится использовать провайдера уведомлений об изменениях. Так, как я мог заставить эту работу?

1 Ответ

1 голос
/ 04 мая 2020

Вы можете использовать Api SchedulerBinding.instance Flutter, чтобы предотвратить это исключение. Ошибка возникает из-за того, что перед созданием метода построения вы вызвали диалоговое окно, которое предотвратит завершение восстановления.

Таким образом, ошибки нет:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...