Hide bottom navigation bar on scroll down and vice versa

前端 未结 3 621
囚心锁ツ
囚心锁ツ 2020-12-19 13:36

I have a list in the body and bottom navigation bar. I want to hide bottom navigation bar with a slide down animation when the posts list is scrolled down and visib

3条回答
  •  旧时难觅i
    2020-12-19 14:08

    Here is the code.

    void main() => runApp(MaterialApp(home: Scaffold(body: MyApp())));
    
    class MyApp extends StatefulWidget {
      @override
      _MyAppState createState() => _MyAppState();
    }
    
    class _MyAppState extends State {
      ScrollController _scrollController;
      double _containerMaxHeight = 56, _offset, _delta = 0, _oldOffset = 0;
    
      @override
      void initState() {
        super.initState();
        _offset = 0;
        _scrollController = ScrollController()
          ..addListener(() {
            setState(() {
              double offset = _scrollController.offset;
              _delta += (offset - _oldOffset);
              if (_delta > _containerMaxHeight)
                _delta = _containerMaxHeight;
              else if (_delta < 0) _delta = 0;
              _oldOffset = offset;
              _offset = -_delta;
            });
          });
      }
    
      @override
      Widget build(BuildContext context) {
        return LayoutBuilder(
          builder: (context, constraints) {
            return Stack(
              alignment: Alignment.bottomCenter,
              children: [
                ListView.builder(
                  physics: ClampingScrollPhysics(),
                  controller: _scrollController,
                  itemCount: 20,
                  itemBuilder: (context, index) => ListTile(title: Text(index.toString())),
                ),
                Positioned(
                  bottom: _offset,
                  width: constraints.maxWidth,
                  child: Container(
                    width: double.infinity,
                    height: _containerMaxHeight,
                    color: Colors.grey[300],
                    child: Row(
                      mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                      children: [
                        _buildItem(Icons.home, "Home"),
                        _buildItem(Icons.blur_circular, "Collection"),
                        _buildItem(Icons.supervised_user_circle, "Community"),
                        _buildItem(Icons.notifications, "Notifications"),
                      ],
                    ),
                  ),
                ),
              ],
            );
          },
        );
      }
    
      Widget _buildItem(IconData icon, String title) {
        return Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Icon(icon, size: 28),
            Text(title, style: TextStyle(fontSize: 10)),
          ],
        );
      }
    }
    

    Note: I tried bottomNavigationBar but things were not working as expected so I created kind of my own bottom navigation bar and you can modify the code further for your use.

    Screenshot

提交回复
热议问题