Allow GridView to overlap SliverAppBar

后端 未结 2 926
无人共我
无人共我 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:04

    I had the same problem and could not solve it with slivers. This example from another stackoverflow question solved my problem.

    flutter - App bar scrolling with overlapping content in Flexible space

    import 'package:flutter/material.dart';
    
    void main() => runApp(new MyApp());
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return new MaterialApp(
          title: 'Scroll demo',
          home: new Scaffold(
            appBar: new AppBar(elevation: 0.0),
            body: new CustomScroll(),
          ),
        );
      }
    }
    
    class CustomScroll extends StatefulWidget {
      @override
      State createState() => new CustomScrollState();
    }
    
    class CustomScrollState extends State {
      ScrollController scrollController;
      double offset = 0.0;
      static const double kEffectHeight = 100.0;
    
      @override
      Widget build(BuildContext context) {
        return new Stack(
          alignment: AlignmentDirectional.topCenter,
          children:  [
            new Container(
              color: Colors.blue,
              height: (kEffectHeight - offset * 0.5).clamp(0.0, kEffectHeight),
            ),
            new Positioned(
              child: new Container(
                width: 200.0,
                child: new ListView.builder(
                  itemCount: 100,
                  itemBuilder: buildListItem,
                  controller: scrollController,
                ),
              ),
            ),
          ],
        );
      }
    
      Widget buildListItem(BuildContext context, int index) {
        return new Container(
          color: Colors.white,
          child: new Text('Item $index')
        );
      }
    
      void updateOffset() {
        setState(() {
          offset = scrollController.offset;
        }); 
      }
    
      @override
      void initState() {
        super.initState();
        scrollController = new ScrollController();
        scrollController.addListener(updateOffset);
      }
    
      @override
      void dispose() {
        super.dispose();
        scrollController.removeListener(updateOffset);
      }
    }
    

    Change the list to a grid and its what you want

提交回复
热议问题