Flutter 当AppBar阴影下没有滚动内容时,如何禁用该阴影

Flutter 当AppBar阴影下没有滚动内容时,如何禁用该阴影,flutter,Flutter,在app_bar.dart文件中提到,高程控制app bar下方阴影的大小,默认情况下,如果AppBar下方没有滚动内容,则不会绘制阴影 这是我的密码: Scaffold( appBar: AppBar( brightness: Brightness.light, backgroundColor: Colors.grey[50], leading: IconButton( icon: Icon(Icons.menu, color: Colors.blue)

在app_bar.dart文件中提到,高程控制app bar下方阴影的大小,默认情况下,如果AppBar下方没有滚动内容,则不会绘制阴影

这是我的密码:

Scaffold(
  appBar: AppBar(
    brightness: Brightness.light,
    backgroundColor: Colors.grey[50],
    leading: IconButton(
      icon: Icon(Icons.menu, color: Colors.blue),
      tooltip: 'Navigation menu',
      onPressed: null,
    ),
    actions: <Widget>[
      IconButton(
        icon: Icon(Icons.search, color: Colors.blue,),
        tooltip: 'Search',
        onPressed: null,
      ),
    ],
  ),
  body: listView,
);
脚手架(
appBar:appBar(
亮度:亮度,亮度,
背景颜色:颜色。灰色[50],
领先:IconButton(
图标:图标(Icons.menu,颜色:Colors.blue),
工具提示:“导航菜单”,
onPressed:null,
),
行动:[
图标按钮(
图标:图标(Icons.search,颜色:Colors.blue,),
工具提示:“搜索”,
onPressed:null,
),
],
),
正文:listView,
);


在我的情况下,阴影总是被画出来的!有没有办法解决这个问题,还是我做错了什么?

感谢

事实上,SliveApp Bar使用的正是这种行为,即当内容未在其下方滚动时没有阴影,如果需要,甚至可以在滚动内容时将其滚动开。下面是一段视频,介绍如何在颤振应用程序中使用碎屑:

此外,如果只希望AppBar没有阴影,可以将其“高程”属性设置为0.0,如下所示:

AppBar(
    elevation: 0.0,
    title: Text("This is my title"),
),
迭戈·贝拉斯克斯对此发表了一篇文章

基本上,您需要的是将一个可滚动的列表视图和一个应用程序栏与其
高程值连接起来。当滚动条的位置在“顶部”时,将高程值设置为0,否则设置为默认值(4)。使用
ScrollController()
小部件很容易

//empty_space is a distance of empty padding, only after scrolling through it the content starts getting under the app bar. 
static const double EMPTY_SPACE = 10.0;
ScrollController _controller;
bool isScrolledToTop = true;

@override
  void initState() {
    _controller = ScrollController();
    _controller.addListener(_scrollListener);
    super.initState();
  }

  _scrollListener() {
    if (_scrollController.offset <= _scrollController.position.minScrollExtent &&
        !_scrollController.position.outOfRange) {
      //call setState only when values are about to change
      if(!isScrolledToTop) {
        setState(() {
          //reach the top
          isScrolledToTop = true;
        });
      }

    }else{
      //call setState only when values are about to change
      if(_scrollController.offset > EMPTY_SPACE && isScrolledToTop) {
        setState(() {
          //not the top
          isScrolledToTop = false;
        });
      }
    }
  }

 @override
  void dispose() {
    _scrollController.dispose();
    super.dispose();
}
最后一步是根据
IsCrolledToTop
标志显示/隐藏应用程序栏的阴影:

appBar: AppBar(
      elevation: isScrolledToTop ? 0 : 4,
      ...,)
重要提示:我强烈建议您使用自己的build()方法(
MyAppBar extends StatefulWidget implements PreferredSizeWidget
)将AppBar创建为一个独立的小部件,并将
\u scrollListener()
方法移到那里

由于
setState(){}
方法强制在调用它的地方重建小部件,因此无论是重建整个页面(使用主列表视图及其所有项等),还是只重建一个AppBar小部件,都很重要。后者要便宜得多


如果你需要更多的细节,请告诉我。干杯

你在脚手架的主体中有什么,你所说的不是AppBari的标高我编辑了我的帖子,并把我所有的代码都包括在内看看我的答案如果你什么都不做,标高默认为4.0。我曾经有过这样一个箱子,下面只有一个容器和装饰盒。如果您想完全消除它,只需将高程设置为0.0;如果希望它是有条件的,可以根据条件使用三元来设置高程值,或者,如果希望变得圆滑和新奇,可以基于列表位置设置高程动画,可滚动位置或任何其他您想要设置动画控制器关键帧的位置。如果我们将scrollListener/scrollController移动到单独的类,是否可以将其设置为ListView作为控制器?
appBar: AppBar(
      elevation: isScrolledToTop ? 0 : 4,
      ...,)