0

我对 Flutter 的 ScrollController 有疑问。当我滚动 ListView 视图并到达列表末尾时,我希望收到通知(在 ie 中的调试控制台上)。我认为我学到的东西不适用于flutter的新版本。你知道为什么吗?或者我在代码中的某个地方犯了错误?

这是我所拥有的

   class _ExploreScreenState extends State<ExploreScreen> {
  final mockServer = MockFooderlichService();
  late final ScrollController _scrollController;

  _scrollListener() {
    if (_scrollController.offset >=
            _scrollController.position.maxScrollExtent &&
        !_scrollController.position.outOfRange) {
      setState(() {
        debugPrint("reach the top");
      });
    }

    if (_scrollController.offset <=
            _scrollController.position.minScrollExtent &&
        !_scrollController.position.outOfRange) {
      setState(() {
        debugPrint("reach the top");
      });
    }
  }

  @override
  void initState() {
    _scrollController = ScrollController();
    _scrollController.addListener(_scrollListener);
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return FutureBuilder<ExploreData>(
      future: mockServer.getExploreData(),
      builder: (context, snapshot) {
        if (snapshot.connectionState == ConnectionState.done) {
          final recipes = snapshot.data!.todayRecipes;

          return ListView(
            controller: _scrollController,
            scrollDirection: Axis.vertical,
            children: [
              TodayRecipeListView(recipes: recipes),
              const SizedBox(
                height: 16,
              ),
              FriendPostListView(
                friendPosts: snapshot.data!.friendPosts,
              ),
            ],
          );
        } else {
          return const Center(
            child: CircularProgressIndicator(),
          );
        }
      },
    );
  }

  @override
  void dispose() {
    _scrollController.dispose();
    super.dispose();
  }
}
4

2 回答 2

0

Add this in your initState. Let me know if it works for you.

 _scrollController.addListener(() { 
  if (_scrollController.position.atEdge) {
      if (_scrollController.position.pixels == 0) {
        print("At the top");
      } else {
        print("At the bottom");
      }
    }
  });
于 2021-10-04T11:42:07.037 回答
0

您的代码中没有这样的问题,除了 print 语句,它们都具有相同的 String 值debugPrint("reach the top");

 _scrollListener() {
    if (_scrollController.offset >=
            _scrollController.position.maxScrollExtent &&
        !_scrollController.position.outOfRange) {
      setState(() {
        debugPrint("reach the bottom");
      });
    }

    if (_scrollController.offset <=
            _scrollController.position.minScrollExtent &&
        !_scrollController.position.outOfRange) {
      setState(() {
        debugPrint("reach the top");
      });
    }
  }

它解决了你的问题吗?

于 2021-09-20T16:27:47.990 回答