Allow GridView to overlap SliverAppBar

后端 未结 2 947
无人共我
无人共我 2021-01-05 11:40

I am trying to reproduce the following example from the earlier Material design specifications (open for animated demo):

Until now I was able to produce the

2条回答
  •  被撕碎了的回忆
    2021-01-05 12:26

    I managed to get this functionality, using the ScrollController and a couple of tricks:

    Here's the code:

      ScrollController _scrollController;
      static const kHeaderHeight = 235.0;
    
      double get _headerOffset {
        if (_scrollController.hasClients) if (_scrollController.offset > kHeaderHeight)
          return -1 * (kHeaderHeight + 50.0);
        else
          return -1 * (_scrollController.offset * 1.5);
    
        return 0.0;
      }
    
      @override
      void initState() {
        super.initState();
    
        _scrollController = ScrollController()..addListener(() => setState(() {}));
      }
    
      @override
      Widget build(BuildContext context) {
        super.build(context);
        return StackWithAllChildrenReceiveEvents(
          alignment: AlignmentDirectional.topCenter,
          children: [
            Positioned(
              top: _headerOffset,
              child: Container(
                height: kHeaderHeight,
                width: MediaQuery.of(context).size.width,
                color: Colors.blue,
              ),
            ),
            Padding(
              padding: EdgeInsets.only(left: 20.0, right: 20.0),
              child: Feed(controller: _scrollController, headerHeight: kHeaderHeight),
            ),
          ],
        );
      }
    

    To make the Feed() not overlap the blue container, I simply made the first child of it a SizedBox with the required height property.

    Note that I am using a modified Stack class. That is in order to let the first Widget in the stack (the blue container) to detect presses, so it will fit my uses; unfortunately at this point the default Stack widget has an issue with that, you can read more about it over https://github.com/flutter/flutter/issues/18450.

    The StackWithAllChildrenReceiveEvents code can be found over https://github.com/flutter/flutter/issues/18450#issuecomment-575447316.

提交回复
热议问题