I am using a ScrollController in the ListView.builder widget. But when I try to print something after reaching end of the screen it doesn't seem to work.

My main goal id to use it for pagination.

class RestaurantList extends StatefulWidget {
  @override
  _RestaurantListState createState() => _RestaurantListState();
}

class _RestaurantListState extends State<RestaurantList> {
  ScrollController _controller;

  void _scrollListener() {
    if (_controller.offset >= _controller.position.maxScrollExtent &&
        !_controller.position.outOfRange) {

      print('new rests');

    }
  }

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

  @override
  Widget build(BuildContext context) {
    // print('restaurant list');
    return FutureBuilder<List<Restaurant>>(
      future: Provider.of<Restaurants>(context, listen: false)
          .fetchAndSetRestaurants(),
      builder: (context, snapshot) {
        // Items are not available and you need to handle this situation, simple solution is to show a progress indicator
        if (!snapshot.hasData) {
          //Navigator.of(context).pushNamed('loading');
          return Center(child: LoadingList());
        }
        final List<Restaurant> restaurants = snapshot.data;

        print('List: ${restaurants[0].name}');
        return ListView.builder(
          controller: _controller,
          physics: ScrollPhysics(),
          scrollDirection: Axis.vertical,
          shrinkWrap: true,
          itemBuilder: (ctx, i) =>
              restaurants[i].isAvailable || restaurants[i].totalQuantity != 0
                  ? Column(
                      children: [
                        ChangeNotifierProvider.value(
                            value: restaurants[i], child: RestaurantInfo()),
                        Container(
                          height: 10,
                        )
                      ],
                    )
                  : Container(),
          itemCount: restaurants.length,
        );
      },
    );
  }
}


Solution 1: KuKu

Try changing like below when checking reaching end of screen.

void _scrollListener() {
    if (_controller.position.atEdge) {
      if (_controller.position.pixels == 0) {
        // Reaching Top
      } else {
        // Reaching end of screen
      }
    }
  }