【问题标题】:How to BottomAppBar backgroundColor transparent如何让BottomAppBar背景颜色透明
【发布时间】:2021-05-04 17:42:33
【问题描述】:

我希望 BottomAppBar 透明并显示正在发生的事情,所以这是我的代码。

class BottomTabNavigation extends StatefulWidget {
  @override
  _BottomTabNavigationState createState() => _BottomTabNavigationState();
}

class _BottomTabNavigationState extends State<BottomTabNavigation>
    with AutomaticKeepAliveClientMixin, SingleTickerProviderStateMixin {
  PageController _pageController;
  int _currentIndex = 0;

  @override
  void initState() {
    super.initState();
    _pageController = PageController(
      initialPage: 0,
    );
  }

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

  @override
  Widget build(BuildContext context) {
    super.build(context);
    return Container(
      child: Stack(
        fit: StackFit.expand,
        children: [
          Container(
            color: Colors.transparent,
          ),
          _buildScaffold(),
        ],
      ),
    );
  }

  Scaffold _buildScaffold() {
    return Scaffold(
      backgroundColor: Colors.transparent,
      body: PageView(
        controller: _pageController,
        physics: NeverScrollableScrollPhysics(),
        children: [
          PostsPage(),
        ],
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {},
        child: Icon(
          Icons.add,
          size: 28,
          color: Colors.white,
        ),
        splashColor: Colors.transparent,
        elevation: 0.6,
      ),
      floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
      bottomNavigationBar: _bottomAppBar(),
    );
  }

  Widget _bottomAppBar() {
    return BottomAppBar(
      elevation: 6,
      notchMargin: 8.0,
      color: Colors.white,
      shape: CustomCircularNotchedRectangle(),
      child: Row(
        children: <Widget>[
          Expanded(
            child: Row(
              mainAxisAlignment: MainAxisAlignment.spaceEvenly,
              children: [
                IconButton(
                  iconSize: 26,
                  icon: Icon(IconFont.icon_home),
                  color: _currentIndex == 0 ? Colors.black : Colors.grey,
                  onPressed: () {
                    setState(() {
                      _currentIndex = 0;
                    });
                  },
                ),
                IconButton(
                  iconSize: 26,
                  icon: Icon(IconFont.icon_search2),
                  color: _currentIndex == 1 ? Colors.black : Colors.grey,
                  onPressed: () {
                    setState(() {
                      _currentIndex = 1;
                    });
                  },
                ),
              ],
            ),
          ),
          SizedBox(
            width: 56,
          ),
          Expanded(
            child: Row(
              mainAxisAlignment: MainAxisAlignment.spaceEvenly,
              children: [
                IconButton(
                  iconSize: 28,
                  icon: Icon(IconFont.icon_message),
                  color: _currentIndex == 2 ? Colors.black : Colors.grey,
                  onPressed: () {
                    setState(() {
                      _currentIndex = 2;
                    });
                  },
                ),
                IconButton(
                  iconSize: 28,
                  icon: Icon(IconFont.icon_user1),
                  color: _currentIndex == 3 ? Colors.black : Colors.grey,
                  onPressed: () {
                    setState(() {
                      _currentIndex = 3;
                    });
                  },
                ),
              ],
            ),
          ),
        ],
      ),
    );
  }

  @override
  bool get wantKeepAlive => true;
}

结果为黑色(如果设置为白色,则看不到其余部分)。

为了实现透明,我将 Scaffold 包裹在 Stack 中并设置了背景颜色,但还是不行。

你是怎么解决这个问题的?

【问题讨论】:

    标签: flutter transparent bottomappbar


    【解决方案1】:

    你需要的只是添加

    extendBody: true,
    

    财产给Scaffold

    【讨论】:

    • 感谢您回来,这个属性解决了问题,但是如果您在底部添加填充,它仍然是白色背景
    【解决方案2】:

    使用Stack 并将PageViewScaffold body 分开:

    class _BottomTabNavigationState extends State<DemoWidget>
        with AutomaticKeepAliveClientMixin, SingleTickerProviderStateMixin {
      PageController _pageController;
      int _currentIndex = 0;
    
      @override
      void initState() {
        super.initState();
        _pageController = PageController(
          initialPage: 0,
        );
      }
    
      @override
      void dispose() {
        super.dispose();
        _pageController.dispose();
      }
    
      @override
      Widget build(BuildContext context) {
        super.build(context);
        return SafeArea(
          child: Stack(
            fit: StackFit.expand,
            children: [
              Container(
                child: PageView(
                  controller: _pageController,
                  physics: NeverScrollableScrollPhysics(),
                  children: [
                    Container(
                      color: Colors.amber,
                      child: Center(
                        child: Text('Empty Body 1'),
                      ),
                    ),
                    Container(
                      color: Colors.red,
                      child: Center(
                        child: Text('Empty Body 2'),
                      ),
                    ),
                    Container(
                      color: Colors.green,
                      child: Center(
                        child: Text('Empty Body 3'),
                      ),
                    ),
                    Container(
                      color: Colors.amber,
                      child: Center(
                        child: Text('Empty Body 4'),
                      ),
                    ),
                  ],
                ),
              ),
              Scaffold(
                backgroundColor: Colors.transparent,
                floatingActionButton: FloatingActionButton(
                  onPressed: () {},
                  child: Icon(
                    Icons.add,
                    size: 28,
                    color: Colors.white,
                  ),
                  splashColor: Colors.transparent,
                  elevation: 0.6,
                ),
                floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
                bottomNavigationBar: _bottomAppBar(),
              ),
            ],
          ),
        );
      }
    
      Widget _bottomAppBar() {
        return BottomAppBar(
          elevation: 6,
          notchMargin: 8.0,
          color: Colors.white,
          shape: CircularNotchedRectangle(),
          child: Row(
            children: <Widget>[
              Expanded(
                child: Row(
                  mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                  children: [
                    IconButton(
                      iconSize: 26,
                      icon: Icon(Icons.home),
                      color: _currentIndex == 0 ? Colors.black : Colors.grey,
                      onPressed: () {
                        setState(() {
                          _currentIndex = 0;
                          _pageController.jumpToPage(_currentIndex);
                        });
                      },
                    ),
                    IconButton(
                      iconSize: 26,
                      icon: Icon(Icons.search),
                      color: _currentIndex == 1 ? Colors.black : Colors.grey,
                      onPressed: () {
                        setState(() {
                          _currentIndex = 1;
                          _pageController.jumpToPage(_currentIndex);
                        });
                      },
                    ),
                  ],
                ),
              ),
              SizedBox(
                width: 56,
              ),
              Expanded(
                child: Row(
                  mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                  children: [
                    IconButton(
                      iconSize: 28,
                      icon: Icon(Icons.message),
                      color: _currentIndex == 2 ? Colors.black : Colors.grey,
                      onPressed: () {
                        setState(() {
                          _currentIndex = 2;
                          _pageController.jumpToPage(_currentIndex);
                        });
                      },
                    ),
                    IconButton(
                      iconSize: 28,
                      icon: Icon(Icons.supervised_user_circle),
                      color: _currentIndex == 3 ? Colors.black : Colors.grey,
                      onPressed: () {
                        setState(() {
                          _currentIndex = 3;
                          _pageController.jumpToPage(_currentIndex);
                        });
                      },
                    ),
                  ],
                ),
              ),
            ],
          ),
        );
      }
    
      @override
      bool get wantKeepAlive => true;
    }
    

    记住要在PageView 的每个孩子的末尾使用Padding 以与BottomAppBar 重叠,您可以使用kBottomNavigationBarHeight 大小作为BottomPadding

    【讨论】:

    • 非常感谢
    • 我刚试了一下,如果PageView包含滚动小部件,你不能操作它们
    猜你喜欢
    • 2012-11-05
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    • 2014-03-22
    • 2019-09-29
    • 2021-07-02
    • 2013-09-02
    • 2011-04-14
    相关资源
    最近更新 更多