Я получаю следующую ошибку в терминале (не в консоли отладки, потому что я запускаю команду 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? Буду признателен за любую помощь. Заранее спасибо!
Привет @RandalSchwartz, спасибо за ваш ответ. Как увидеть контент, который повторяется снова и снова?
Если это на веб-сайте Flutter, и вы звоните riverpod
провайдеру с помощью autoDispose
, то это точно так, как я спрашивал здесь.
После обновления до новой версии это исправляется.
Скорее всего, это бесконечная рекурсия. Посмотрите на стек в вашей IDE и посмотрите, что повторяется снова и снова. Это в одном из них.