Search code examples
flutterdelay

Flutter - ScrollController.position.maxScrollExtent returns null


I'm using ScrollController on my StatefulWidget and Later in this widget, I'm trying to get the _scrollController.position.maxScrollExtent property and I'm getting null. but when I change anything on my screen (tap, scroll, rotate, etc.) the error disappear.

Should I add some sort of delay to the _scrollController.position.maxScrollExtent calculation? and if so, how?

class MyWidget extends StatefulWidget {
  const MyWidget({Key? key}) : super(key: key);
  
  @override
  State<MyWidget> createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> {
  late ScrollController _scrollController = ScrollController();

  double _scrollControllerOffset = 0.0;

  _scrollListener() {
    setState(() {
      _scrollControllerOffset = _scrollController.offset;
    });
  }

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

    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider(
      create: (BuildContext context) => ProductsProvider(),
      child: Directionality(
        textDirection: TextDirection.rtl,
        child: Scaffold(
          body: CustomScrollView(
            controller: _scrollController,
            slivers: [
              const SliverPersistentHeader(
                delegate: MainAppBar(),
                pinned: true,
              ),
              SliverList(
                delegate: SliverChildBuilderDelegate(
                    (BuildContext context, int index) {
                  return _buildBody(context);
                }, childCount: 1),
              ),
            ],
          ),
        ),
      ),
    );
  }

   Stack _buildBody(context) {
    return Stack(
      children: [
       Text(_scrollController.position.maxScrollExtent); //    <== here I use 'maxScrollExtent'
      ],
    );
  }
}

Solution

  •  _scrollListener() {
        if(_scrollController.hasClients){
           setState(() {
              _scrollControllerOffset = _scrollController.offset;
           });
        }
       
    }