Flutter 当AppBar阴影下没有滚动内容时,如何禁用该阴影
在app_bar.dart文件中提到,高程控制app bar下方阴影的大小,默认情况下,如果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)
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,
...,)