Flutter 滚动时SilverApp隐藏不工作
向下滚动时,我们希望隐藏Flutter 滚动时SilverApp隐藏不工作,flutter,dart,appbar,Flutter,Dart,Appbar,向下滚动时,我们希望隐藏appBar,只显示tabBar,与此完全相同 然而,在我们的情况下,它不起作用。只有当我们单击并滚动appBar时,它才会隐藏 main.dart @override Widget build(BuildContext context) { return Scaffold( body: NestedScrollView( body: TabBarView( controller: _tabController,
appBar
,只显示tabBar
,与此完全相同
然而,在我们的情况下,它不起作用。只有当我们单击并滚动appBar
时,它才会隐藏
main.dart
@override
Widget build(BuildContext context) {
return Scaffold(
body: NestedScrollView(
body: TabBarView(
controller: _tabController,
children: <Widget>[TabA(), TabA()],
),
floatHeaderSlivers: true,
headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
return <Widget>[
SliverAppBar(
title: Text("Silver App"),
pinned: true,
floating: true,
forceElevated: innerBoxIsScrolled,
bottom: TabBar(
unselectedLabelColor: Colors.white,
labelColor: Colors.white,
tabs: <Widget>[
Tab(
text: "Tab A",
),
Tab(
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text("Tab B"),
Padding(
padding: EdgeInsets.only(left: 15),
),
],
),
),
],
controller: _tabController,
indicatorColor: Colors.white,
indicatorSize: TabBarIndicatorSize.tab,
),
),
];
},
));
}
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
class TabA extends StatefulWidget {
@override
State<StatefulWidget> createState() => _TabAState();
}
class _TabAState extends State<TabA> with SingleTickerProviderStateMixin {
final GlobalKey<RefreshIndicatorState> _refreshIndicatorKey =
new GlobalKey<RefreshIndicatorState>();
bool isLoading = false;
ScrollController _controller;
int page = 1;
AnimationController controller;
Animation<Offset> offset;
@override
void initState() {
super.initState();
_controller = ScrollController()..addListener(_scrollListener);
controller =
AnimationController(vsync: this, duration: Duration(milliseconds: 500));
offset = Tween<Offset>(begin: Offset.zero, end: Offset(0.0, 2.0))
.animate(controller);
}
final data = [
'T 0',
'T 1',
'T 2',
...
];
@override
Widget build(BuildContext context) {
return Scaffold(
floatingActionButton: SlideTransition(
position: offset,
child: FloatingActionButton(
elevation: 0.0,
child: Icon(Icons.add, color: Colors.white),
onPressed: () {})),
body: RefreshIndicator(
key: _refreshIndicatorKey,
onRefresh: _refresh,
child: _showData()));
}
void _scrollListener() async {
if (_controller.position.pixels == _controller.position.maxScrollExtent) {
// display loading on bottom of listView
}
if (_controller.position.userScrollDirection == ScrollDirection.reverse) {
setState(() {
controller.forward();
});
}
if (_controller.position.userScrollDirection == ScrollDirection.forward) {
setState(() {
controller.reverse();
});
}
}
Widget _showData() {
return Stack(
children: <Widget>[
_showListView(),
// Align(
// child: Row(
// mainAxisAlignment: MainAxisAlignment.center,
// children: <Widget>[
// Padding(
// padding: EdgeInsets.only(bottom: 15),
// child: Text("loading .....",
// style: TextStyle(
// color: const Color(0xff000066),
// fontSize: 15,
// ))),
// SizedBox(
// width: 12,
// ),
// ]),
// alignment: FractionalOffset.bottomCenter,
// )
],
);
}
Widget _showListView() {
return ListView.builder(
controller: _controller,
itemCount: data.length,
itemBuilder: (context, index) {
return Text(data[index]);
});
}
Future<void> _refresh() {
// return data;
}
}
@覆盖
小部件构建(构建上下文){
返回脚手架(
正文:嵌套滚动视图(
正文:选项卡视图(
控制器:\ tab控制器,
子项:[TabA(),TabA()],
),
浮头肝脏:是的,
headerSliverBuilder:(BuildContext上下文,boolInnerBoxIsCrolled){
返回[
滑杆(
标题:文本(“银色应用程序”),
对,,
浮动:是的,
强制提升:内包装箱为羊角形,
底部:选项卡栏(
未选择的标签颜色:Colors.white,
labelColor:Colors.white,
选项卡:[
标签(
文本:“选项卡A”,
),
标签(
孩子:排(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
文本(“选项卡B”),
填充物(
填充:仅限边缘设置(左:15),
),
],
),
),
],
控制器:\ tab控制器,
指示颜色:颜色。白色,
指标化:TabBarIndicatorSize.tab,
),
),
];
},
));
}
TabA.dart
@override
Widget build(BuildContext context) {
return Scaffold(
body: NestedScrollView(
body: TabBarView(
controller: _tabController,
children: <Widget>[TabA(), TabA()],
),
floatHeaderSlivers: true,
headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
return <Widget>[
SliverAppBar(
title: Text("Silver App"),
pinned: true,
floating: true,
forceElevated: innerBoxIsScrolled,
bottom: TabBar(
unselectedLabelColor: Colors.white,
labelColor: Colors.white,
tabs: <Widget>[
Tab(
text: "Tab A",
),
Tab(
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text("Tab B"),
Padding(
padding: EdgeInsets.only(left: 15),
),
],
),
),
],
controller: _tabController,
indicatorColor: Colors.white,
indicatorSize: TabBarIndicatorSize.tab,
),
),
];
},
));
}
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
class TabA extends StatefulWidget {
@override
State<StatefulWidget> createState() => _TabAState();
}
class _TabAState extends State<TabA> with SingleTickerProviderStateMixin {
final GlobalKey<RefreshIndicatorState> _refreshIndicatorKey =
new GlobalKey<RefreshIndicatorState>();
bool isLoading = false;
ScrollController _controller;
int page = 1;
AnimationController controller;
Animation<Offset> offset;
@override
void initState() {
super.initState();
_controller = ScrollController()..addListener(_scrollListener);
controller =
AnimationController(vsync: this, duration: Duration(milliseconds: 500));
offset = Tween<Offset>(begin: Offset.zero, end: Offset(0.0, 2.0))
.animate(controller);
}
final data = [
'T 0',
'T 1',
'T 2',
...
];
@override
Widget build(BuildContext context) {
return Scaffold(
floatingActionButton: SlideTransition(
position: offset,
child: FloatingActionButton(
elevation: 0.0,
child: Icon(Icons.add, color: Colors.white),
onPressed: () {})),
body: RefreshIndicator(
key: _refreshIndicatorKey,
onRefresh: _refresh,
child: _showData()));
}
void _scrollListener() async {
if (_controller.position.pixels == _controller.position.maxScrollExtent) {
// display loading on bottom of listView
}
if (_controller.position.userScrollDirection == ScrollDirection.reverse) {
setState(() {
controller.forward();
});
}
if (_controller.position.userScrollDirection == ScrollDirection.forward) {
setState(() {
controller.reverse();
});
}
}
Widget _showData() {
return Stack(
children: <Widget>[
_showListView(),
// Align(
// child: Row(
// mainAxisAlignment: MainAxisAlignment.center,
// children: <Widget>[
// Padding(
// padding: EdgeInsets.only(bottom: 15),
// child: Text("loading .....",
// style: TextStyle(
// color: const Color(0xff000066),
// fontSize: 15,
// ))),
// SizedBox(
// width: 12,
// ),
// ]),
// alignment: FractionalOffset.bottomCenter,
// )
],
);
}
Widget _showListView() {
return ListView.builder(
controller: _controller,
itemCount: data.length,
itemBuilder: (context, index) {
return Text(data[index]);
});
}
Future<void> _refresh() {
// return data;
}
}
import'包装:flift/cupertino.dart';
进口“包装:颤振/材料.省道”;
导入“package:flatter/rendering.dart”;
类TabA扩展了StatefulWidget{
@凌驾
State createState()=>u TabAState();
}
类_TabAState使用SingleTickerProviderStateMixin扩展状态{
最后一次全球杯=
新GlobalKey();
bool isLoading=false;
滚动控制器(u控制器),;
int page=1;
动画控制器;
动画偏移;
@凌驾
void initState(){
super.initState();
_控制器=ScrollController()…addListener(\u scrollListener);
控制器=
AnimationController(vsync:this,duration:duration(毫秒:500));
偏移=二者之间(开始:偏移.0,结束:偏移(0.0,2.0))
.制作动画(控制器);
}
最终数据=[
‘t0’,
‘t1’,
‘t2’,
...
];
@凌驾
小部件构建(构建上下文){
返回脚手架(
浮动操作按钮:滑动转换(
位置:偏移,
子:浮动操作按钮(
标高:0.0,
子项:图标(Icons.add,颜色:Colors.white),
onPressed:({})),
正文:刷新指示器(
键:_refreshIndicatorKey,
onRefresh:\u refresh,
子项:_showData());
}
void\u scrollListener()异步{
if(_controller.position.pixels==_controller.position.maxScrollExtent){
//在listView的底部显示加载
}
if(_controller.position.userScrollDirection==ScrollDirection.reverse){
设置状态(){
controller.forward();
});
}
if(_controller.position.userScrollDirection==ScrollDirection.forward){
设置状态(){
controller.reverse();
});
}
}
Widget_showData(){
返回堆栈(
儿童:[
_showListView(),
//对齐(
//孩子:排(
//mainAxisAlignment:mainAxisAlignment.center,
//儿童:[
//填充物(
//填充:仅限边缘设置(底部:15),
//子项:文本(“加载…”,
//样式:TextStyle(
//颜色:常量颜色(0xff000066),
//尺寸:15,
// ))),
//大小盒子(
//宽度:12,
// ),
// ]),
//对齐:分馏Loffset.bottomCenter,
// )
],
);
}
小部件_showListView(){
返回ListView.builder(
控制器:_控制器,
itemCount:data.length,
itemBuilder:(上下文,索引){
返回文本(数据[索引]);
});
}
未来(更新){
//返回数据;
}
}
输出:
如您所见,
appBar
在listView
滚动时不会隐藏。它只有在按下应用程序栏并滚动时才会隐藏。这里是基于您的代码的工作代码。关键点是“ScrollController”实例由“NestedScrollView”上下文创建
并将该“ScrollController”实例传递给TabBarView子级中的“ListView”内部
导入“包装:颤振/材料.省道”;
导入“package:flatter/rendering.dart”;
void main(){
runApp(MyApp());
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“颤振演示”,
主题:主题数据(
主样本:颜色。蓝色,
视觉密度:视觉密度。自适应平台密度,
),
主页:MyHomePage(标题:“颤振演示主页”),
);
}
}
类MyHomePage扩展StatefulWidget{
MyHomePage({Key,this.title}):超级(Key:Key);
最后的字符串标题;
@凌驾
_MyHomePageState createState()=>\u MyHomePageState();
}
类_MyHomePageState扩展状态
使用SingleTickerProviderStateMixin{
TabController\u TabController;
@凌驾
void initState(){
super.initState();
_tabController=tabController(初始索引:0,长度:2,vsync:this);
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:嵌套滚动视图(
车身:建造商(
生成器:(上下文){
final _scr=PrimaryScrollController.of(上下文);
ret