Как решить проблему бесконечного цикла во Flutter?

Я получаю следующую ошибку в терминале (не в консоли отладки, потому что я запускаю команду flutter run -d chrome --web-hostname localhost --web-port 7357):

══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
The following JSRangeError was thrown building App(dirty, dependencies: [UncontrolledProviderScope],
state: _AppState#e4a9b):
Invalid argument: Maximum call stack size exceeded

The relevant error-causing widget was:
  App App:file:///Users/user/development/projects/flutter/project/lib/src/project.dart:46:21

When the exception was thrown, this was the stack:
packages/riverpod/src/framework/auto_dispose.dart 7:24                     <computed>
packages/riverpod/src/stream_provider/base.dart 110:56                     __
packages/riverpod/src/stream_provider/auto_dispose.dart 42:7               __
packages/riverpod/src/stream_provider/auto_dispose.dart 31:45              createElement
packages/riverpod/src/framework/container.dart 49:32                       [_create]
packages/riverpod/src/framework/container.dart 41:52                       getElement
packages/riverpod/src/framework/container.dart 455:39                      <fn>
packages/riverpod/src/framework/provider_base.dart 75:25                   addListener
packages/riverpod/src/framework/container.dart 298:20                      listen
packages/flutter_riverpod/src/consumer.dart 506:25                         <fn>
dart-sdk/lib/_internal/js_dev_runtime/private/linked_hash_map.dart 194:23  putIfAbsent
packages/flutter_riverpod/src/consumer.dart 510:8                          watch
packages/project/src/app.dart 61:34                                         build
packages/flutter/src/widgets/framework.dart 4992:27                        build
packages/flutter_riverpod/src/consumer.dart 488:20                         build
packages/flutter/src/widgets/framework.dart 4878:15                        performRebuild
packages/flutter/src/widgets/framework.dart 5050:11                        performRebuild
packages/flutter/src/widgets/framework.dart 4604:5                         rebuild
packages/flutter/src/widgets/framework.dart 4859:5                         [_firstBuild]
packages/flutter/src/widgets/framework.dart 5041:11                        [_firstBuild]
…
════════════════════════════════════════════════════════════════════════════════════════════════════

Я погуглил эту ошибку и увидел этот ответ . Этот ответ говорит:

У вас есть эта ошибка, потому что есть бесконечный цикл с FeedScreen

Я думаю, что смысл этого ответа - «бесконечный цикл».

Однако я не могу найти, где в коде бесконечный цикл.

Я пытаюсь рассказать о своей структуре кода, надеюсь, всем понятно. Код в моем проекте, то есть код обслуживания. Я могу установить для обслуживания значение true или false в Firebase Cloud Firestore , а затем использовать пакет flutter_riverpod для считывания значения обслуживания. Если значение обслуживания равно true, отображается экран обслуживания, в противном случае отображается экран по умолчанию.

Мой код:

class MaintenanceModel {
  MaintenanceModel(
    this.id,
    this.isUnderMaintenance,
  );

  final String id;
  final bool isUnderMaintenance;

  factory MaintenanceModel.fromMap(
    Map<String, dynamic> data,
    String documentId,
  ) {
    final bool? isUnderMaintenance = data["isUnderMaintenance"];

    return MaintenanceModel(
      documentId,
      isUnderMaintenance ?? false,
    );
  }
}

Stream<T> documentStream<T>({
    required String path,
    required T Function(Map<String, dynamic> data, String documentID) builder,
  }) {
    DocumentReference<Object?> reference = firestore.doc(path);
    Stream<DocumentSnapshot<Object?>> snapshots = reference.snapshots();
    return snapshots.map((snapshot) => builder(
          snapshot.data() == null
              ? {}
              : snapshot.data() as Map<String, dynamic>,
          snapshot.id,
        ));
  }

Stream<MaintenanceModel> maintenanceStream() {
  return AppServices.kFirestoreService.documentStream(
    path: "Admins/maintenance",
    builder: (data, documentId) => MaintenanceModel.fromMap(data, documentId),
  );
}

final maintenanceProvider = StreamProvider.autoDispose<MaintenanceModel>((ref) {
  final repository = ref.watch(provider);

  return repository.maintenanceStream();
});

final maintenanceValue = ref.watch(maintenanceProvider);

maintenanceValue.when(
  data: (maintenance) => maintenance.isUnderMaintenance ? MaintenanceScreen() : DefaultScreen(),
  error: (error, stackTrace) => const Center(child: Text("Error!")),
  loading: () => const Center(child: CircularProgressIndicator()),
),

Если вам нужна дополнительная информация, не стесняйтесь оставлять комментарии!

Как решить проблему бесконечного цикла во Flutter? Буду признателен за любую помощь. Заранее спасибо!

Скорее всего, это бесконечная рекурсия. Посмотрите на стек в вашей IDE и посмотрите, что повторяется снова и снова. Это в одном из них.

Randal Schwartz 20.11.2022 06:08

Привет @RandalSchwartz, спасибо за ваш ответ. Как увидеть контент, который повторяется снова и снова?

My Car 20.11.2022 06:13
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
185
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если это на веб-сайте Flutter, и вы звоните riverpod провайдеру с помощью autoDispose, то это точно так, как я спрашивал здесь.

После обновления до новой версии это исправляется.

Другие вопросы по теме