如何让内部有状态小部件接收到 Flutter 中的滚动事件?

Posted

技术标签:

【中文标题】如何让内部有状态小部件接收到 Flutter 中的滚动事件?【英文标题】:How to make the inner stateful widget received the scroll event in Flutter? 【发布时间】:2020-04-11 18:48:12 【问题描述】:

我在 ListView 中有一个 GridView,但 GridView 包含在不同的 Stateful 小部件中。我注意到我放在 GridView 上的 ScrollController 从未被调用,但我需要它以便我可以检测屏幕是否已到达底部,以便我可以加载下一批数据(无限滚动)。我该怎么做?我尝试将 primary: true 添加到 GridView 并将 primary: false 添加到 ListView 但它不起作用。

class UserProfile extends StatefulWidget
-> final userId: String;
-> build () 
   -> ListView 
      -> children: [
         -> User avatar
         -> User name
         -> Action button
         -> TileGallery(userId: userId)

class TileGallery extends StatefulWidget
-> final _scrollController = Controller();
-> initState() 
   -> _scrollController.addListener(_onScroll);
-> build () 
   -> GridView 
      -> controller: _scrollController
-> _onScroll()      // never called

对不起,奇怪的代码。实际代码中有太多不相关的代码。问题是,我曾经将 TileGallery 用作独立的屏幕小部件(例如,在构建中有 Scaffold),当时,_onScroll() 函数被调用。我该如何解决这个问题?

【问题讨论】:

你能给我包含这个Controller类的文件名吗? 【参考方案1】:

创建ScrollController 实例,而不仅仅是Controller

【讨论】:

有趣。但目前我不得不使用一种解决方法,将所有这两个小部件放在一个小部件中,以简化重建通知和数据流。将尝试在下一次小部件重构中使用您的解决方案。谢谢。

以上是关于如何让内部有状态小部件接收到 Flutter 中的滚动事件?的主要内容,如果未能解决你的问题,请参考以下文章

Flutter - setState 不更新内部有状态小部件

我们如何使用 Flutter 中的底部导航栏触发有状态小部件以通过导航重建自身?

Flutter 状态管理(BloC):无状态与有状态小部件

在 Flutter 中使用 BLoC - 在有状态小部件与无状态小部件中的使用

如何从有状态小部件类 Flutter 访问小部件状态

Flutter:如何从浮动操作按钮调用小部件状态类的方法