SliverAppBar仅在滚动后向上推

时间:2019-05-27 14:40:02

标签: flutter flutter-sliver flutter-appbar

我有一个SliverAppBar(浮动:true,固定:false)。

我想实现在SliverAppBar开始压缩/向上滑动之前,用户必须滚动200个像素(或其他数量)。

1 个答案:

答案 0 :(得分:0)

这里的问题是pinned的值不应更改。如果您尝试在滚动200像素后进行更改,则SliverAppBar会突然缩小。

您可以通过运行以下代码来进行检查:

class Buster extends StatefulWidget {
  @override
  _BusterState createState() => _BusterState();
}

class _BusterState extends State<Buster> {
  ScrollController controller;
  bool isAppBarPinned;

  @override
  void initState() {
    super.initState();
    controller = ScrollController()..addListener(onScroll);
    isAppBarPinned = true;
  }

  void onScroll() {
    if (controller.position.pixels > 200) {
      if (isAppBarPinned) {
        setState(() => isAppBarPinned = false);
      }
    } else {
      if (!isAppBarPinned) {
        setState(() => isAppBarPinned = true);
      }
    }
  }

  @override
  void dispose() {
    controller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: CustomScrollView(
        controller: controller,
        slivers: [
          SliverAppBar(
            title: Text('Buster'),
            floating: true,
            pinned: isAppBarPinned,
          ),
          SliverFixedExtentList(
            itemExtent: 150,
            delegate: SliverChildListDelegate(
              [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
                  .map((int index) => Center(child: Text('Item #$index')))
                  .toList(),
            ),
          )
        ],
      ),
    );
  }
}

所以我认为您在这里获得的最佳选择是使用常规的AppBaranimate it manuallyTransform