首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何检测SliverAppBar已固定

如何检测SliverAppBar已固定
EN

Stack Overflow用户
提问于 2020-09-18 13:32:53
回答 1查看 703关注 0票数 0

我对我的申请很感兴趣。我想要做的是,当SliverAppBar完全向上滚动时,我想在其中显示一个不同的小部件。

有人能在这方面提供一些帮助吗?

我知道使用SliverPersistentHeader可以做这样的事情。但是有没有办法根据头部的位置来显示和隐藏头部呢?

代码语言:javascript
复制
class SliversBasicPage extends StatelessWidget {
  _isPinned() {
    return false;
  }
  @override
  Widget build(BuildContext context) {
    return CustomScrollView(
      slivers: <Widget>[
        SliverAppBar(
          pinned: true,
          floating: false,
          expandedHeight: 120.0,
          flexibleSpace: FlexibleSpaceBar(
            title: _isPinned() ? Text('PINNED') : Text('NOT PINNED'),
          ),
        ),
        SliverFixedExtentList(
          itemExtent: 50,
          delegate: SliverChildListDelegate([
            Container(color: Colors.red),
            Container(color: Colors.green),
            Container(color: Colors.blue),
          ]),
        ),
      ],
    );
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-18 15:08:33

有几件事你需要做。首先,您需要一个statefull小部件,以便更改固定标志的状态并重新构建UI。其次,您将需要一个ScrollController来侦听滚动状态,并根据应用程序栏的折叠/非折叠状态将值切换为isPinned

控制器可能如下所示:

代码语言:javascript
复制
final ScrollController _sliverScrollController = ScrollController();
  var isPinned = false;

.....

  @override
  void initState() {
    super.initState();

    _sliverScrollController.addListener(() {
      if (!isPinned &&
          _sliverScrollController.hasClients &&
          _sliverScrollController.offset > kToolbarHeight) {
        setState(() {
          isPinned = true;
        });
      } else if (isPinned &&
          _sliverScrollController.hasClients &&
          _sliverScrollController.offset < kToolbarHeight) {
        setState(() {
          isPinned = false;
        });
      }
    });
  }

.....

将此控制器添加到CustomScrollView中的控制器参数。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63949857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档