Flutter:如何仅在滚动后显示 AppBar?

Posted

技术标签:

【中文标题】Flutter:如何仅在滚动后显示 AppBar?【英文标题】:Flutter: How to show AppBar only after scrolling? 【发布时间】:2021-08-04 19:16:27 【问题描述】:

这就是你读到的。我不想隐藏AppBar滚动时,有很多信息。

我想要的恰恰相反。我希望我的主页打开没有 AppBar,然后,当用户开始滚动时,将显示 appbar。

这个网站完全符合我的要求:https://www.kirschnerbrasil.cc/(在桌面版中)。

我想我需要使用SliverAppBar,但我还没有设法这样做。有人可以帮忙吗?

谢谢!

【问题讨论】:

【参考方案1】:

在这种情况下,您必须将自定义小部件设为应用栏。请看下面的代码,它会帮助你理解这个过程:

class HomePage extends StatefulWidget 
  @override
  _HomePageState createState() => _HomePageState();


class _HomePageState extends State<HomePage> 
  // Height of your Container
  static final _containerHeight = 100.0;

  // You don't need to change any of these variables
  var _fromTop = -_containerHeight;
  var _controller = ScrollController();
  var _allowReverse = true, _allowForward = true;
  var _prevOffset = 0.0;
  var _prevForwardOffset = -_containerHeight;
  var _prevReverseOffset = 0.0;

  @override
  void initState() 
    super.initState();
    _controller.addListener(_listener);
  

  // entire logic is inside this listener for ListView
  void _listener() 
    double offset = _controller.offset;
    var direction = _controller.position.userScrollDirection;

    if (direction == ScrollDirection.reverse) 
      _allowForward = true;
      if (_allowReverse) 
        _allowReverse = false;
        _prevOffset = offset;
        _prevForwardOffset = _fromTop;
      

      var difference = offset - _prevOffset;
      _fromTop = _prevForwardOffset + difference;
      if (_fromTop > 0) _fromTop = 0;
     else if (direction == ScrollDirection.forward) 
      _allowReverse = true;
      if (_allowForward) 
        _allowForward = false;
        _prevOffset = offset;
        _prevReverseOffset = _fromTop;
      

      var difference = offset - _prevOffset;
      _fromTop = _prevReverseOffset + difference;
      if (_fromTop < -_containerHeight) _fromTop = -_containerHeight;
    
    setState(() ); // for simplicity I'm calling setState here, you can put bool values to only call setState when there is a genuine change in _fromTop
  

  @override
  Widget build(BuildContext context) 
    return Scaffold(
      appBar: AppBar(title: Text("ListView")),
      body: Stack(
        children: <Widget>[
          _yourListView(),
          Positioned(
            top: _fromTop,
            left: 0,
            right: 0,
            child: _yourContainer(),
          )
        ],
      ),
    );
  

  Widget _yourListView() 
    return ListView.builder(
      itemCount: 100,
      controller: _controller,
      itemBuilder: (_, index) => ListTile(title: Text("Item $index")),
    );
  

  Widget _yourContainer() 
    return Opacity(
      opacity: 1 - (-_fromTop / _containerHeight),
      child: Container(
        height: _containerHeight,
        color: Colors.red,
        alignment: Alignment.center,
        child: Text("Your Container", style: TextStyle(fontSize: 32, fontWeight: FontWeight.bold, color: Colors.white)),
      ),
    );
  

【讨论】:

天才!谢谢你。我想知道是否可以让 AppBar 仅在到达顶部时消失,而不是在用户向上滚动时消失。 使用我提供的代码。您将能够这样做。

以上是关于Flutter:如何仅在滚动后显示 AppBar?的主要内容,如果未能解决你的问题,请参考以下文章

appbar下如何滑动页面flutter

在 Scroll Flutter 上隐藏 Appbar?

如何在您的Flutter应用程序中添加SliverAppBar

Flutter- Gridview里面的listview问题

Flutter 仿京东商品详情页嵌套滚动组件

如何在仍然显示Widgets的情况下将我的AppBar放在Flutter中的单独文件中?