Fatal Exception: Bad state:元素太多



我在滚动控制器上使用addListener时遇到上述错误。类初始化一次,但方法被调用多次,并且错误发生的地方

我已经全局声明了控制器,如

ScrollController rwScrollController = ScrollController();

在方法内部使用,如

fetchRewardLadder(
String code, {
bool fromFab = false,
}) async {
rwScrollController = ScrollController(); //----> initialised


GccApiResponse response = await _repository.fetchRewardLadder(
Variables$Query$fetchRewardLadder(
code: code,
),
);
switch (response.status) {
case Status.ERROR:
showExceptionSnackbar(message: response.message);
break;
default:
try {
Query$fetchRewardLadder$fetchRewardLadder reward =
Query$fetchRewardLadder$fetchRewardLadder.fromJson(
response.data["fetchRewardLadder"],
);
safeEmit(
state.copyWith(
rewardLadder: reward,
isLoading: false,
),
);

rwScrollController.addListener(
() {
//--------- getting error here ----------------
if (rwScrollController.position.pixels >
(0.95 * rwScrollController.position.maxScrollExtent) &&
!state.isLoading &&
state.leaderboard == null) {
fetchLeaderBoard(code);
}
},
);
} catch (e) {
showExceptionSnackbar(
message: "Formatting failed" + e.toString(),
);
}
}
}

完整的崩溃日志:

致命异常:io.flutter.plugins.firebase.crash . fluttererror:坏状态:元素太多。抛出的错误实例"ErrorDescription"。_GrowableList.single(飞镖:核心)ScrollController.position (scroll_controller.dart: 109)在RewardLadderCubit.fetchRewardLadder。(reward_ladder_cubit.dart: 136)ChangeNotifier.notifyListeners (change_notifier.dart: 381)ChangeNotifier.notifyListeners (change_notifier.dart: 381)ScrollPosition.notifyListeners (scroll_position.dart: 984)ScrollPosition.setPixels (scroll_position.dart: 281)ScrollPositionWithSingleContext.setPixels (scroll_position_with_single_context.dart: 78)ScrollPositionWithSingleContext.applyUserOffset (scroll_position_with_single_context.dart: 122)ScrollDragController.update (scroll_activity.dart: 387)ScrollableState._handleDragUpdate (scrollable.dart: 719)在DragGestureRecognizer._checkUpdate。(monodrag.dart: 483)GestureRecognizer.invokeCallback (recognizer.dart: 253)DragGestureRecognizer._checkUpdate (monodrag.dart: 483)DragGestureRecognizer.handleEvent (monodrag.dart: 330)PointerRouter._dispatch (pointer_router.dart: 98)在PointerRouter._dispatchEventToRoutes。(pointer_router.dart: 143)_LinkedHashMapMixin.forEach (dart:收集)PointerRouter._dispatchEventToRoutes (pointer_router.dart: 141)PointerRouter.route (pointer_router.dart: 127)GestureBinding.handleEvent (binding.dart: 460)GestureBinding.dispatchEvent (binding.dart: 440)RendererBinding.dispatchEvent (binding.dart: 336)GestureBinding._handlePointerEventImmediately (binding.dart: 395)GestureBinding.handlePointerEvent (binding.dart: 357)GestureBinding._flushPointerEventQueue (binding.dart: 314)GestureBinding._handlePointerDataPacket (binding.dart: 295)

问题是,每当我声明它全局颤动引擎没有处置小部件作为cubit正在使用,所以每当它重新渲染它重新分配新的scrollController到相同的列表视图,从而导致错误。所以我创建了一个新方法,并在每次widget重新渲染时使用它。

ScrollController getRWController() {
ScrollController rwScrollController = ScrollController();
rwScrollController.addListener(
() {
if (rwScrollController.position.pixels >
(0.95 * rwScrollController.position.maxScrollExtent) &&
!state.isLoading &&
state.leaderboard == null) {
fetchLeaderBoard(this.code);
}
},
);
return rwScrollController;
}

并在listview中作为

使用
ListView(
controller: context.read<RewardLadderCubit>().getRWController(),
children: [],
),