Flutter ScrollController AssertionError: '_positions.isNotEmpty': 关闭路由时 ScrollController 未附加到任何滚动视图

Flutter ScrollController AssertionError: '_positions.isNotEmpty': ScrollController not attached to any scroll views when closing route

提问人:Abir Ahsan 提问时间:10/15/2023 更新时间:10/15/2023 访问量:26

问:

我在 Flutter 应用程序中遇到了与 ScrollController 相关的错误。我有一个 QuestionDetailsScreen,我在其中使用 ScrollController 来监视滚动位置。我想在 QuestionDetailsScreen 路由关闭时在控制器中触发一个函数。为此,我实现了一个自定义的 NavigatorObserver。但是,我收到错误:fireWhenCloseQuestionDetails()

“_positions.isNotEmpty”: ScrollController 未附加到任何滚动视图

这是我的 QuestionBankController:

  class QuestionBankController extends GetxController {
  ScrollController questionDetailsScrollCtrl = ScrollController();

  @override
  void onInit() {
    questionDetailsScrollCtrl = ScrollController();
    questionDetailsScrollCtrl.addListener(_onScroll);
    super.onInit();
  }

  void _onScroll() {
    // This function will be called every time the scroll position changes
    print("Scroll position: ${questionDetailsScrollCtrl.position.pixels}");
  }

  void fireWhenCloseQuestionDetails() {
    print("Fire");
    print(questionDetailsScrollCtrl.position.pixels);
  }

  @override
  void onClose() {
    print("On close");
    questionDetailsScrollCtrl.dispose();
    super.onClose();
  }
}

我正在使用自定义在路由关闭时触发:NavigatorObserverfireWhenCloseQuestionDetails()QuestionDetailsScreen

class MyNavigatorObserver extends NavigatorObserver {
  @override
  void didPop(Route<dynamic> route, Route<dynamic>? previousRoute) {
    if (route.settings.name == "/questiondetailsscreen") {
      Future.delayed(Duration.zero, () {
        QuestionBankController().fireWhenCloseQuestionDetails();
      });
    }
  }
}

似乎该问题可能与调用 时创建的新实例有关。在关闭路由时,如何确保使用与我的特定关联的正确实例?QuestionBankControllerfireWhenCloseQuestionDetails()QuestionBankControllerQuestionDetailsScreen

其他信息:

  • 滚动侦听功能正常工作,同时 滚动。
Flutter Routes Scroll Navigator 观察者

评论


答:

0赞 debug_ing 10/15/2023 #1

打电话进来怎么样?fireWhenCloseQuestionDetails()QuestionBankControlleronClose

@override
void onClose() {
  print("On close");
  fireWhenCloseQuestionDetails();
  questionDetailsScrollCtrl.dispose();
  super.onClose();
}

可能如果你被绑定到.QuestionBankControllerQuestionDetailsScreen

评论

0赞 Abir Ahsan 10/15/2023
实际上,我使用这个控制器两页。这意味着当我从 QuestionDetailsScreen() 回到 QuestionListScreen() 时,我的控制器就存在了
0赞 Abir Ahsan 10/20/2023
我也试过这个,但没有用
0赞 debug_ing 10/21/2023
然后将 QuestionDetailsScreen 更改为 StatefulWidget,并重写 onDispose 以调用 fireWhenCloseQuestionDetails。
0赞 Abir Ahsan 10/21/2023
仍然不工作