flutter - Flutter - 动画完成后滚动
问题描述
我使用补间动画在容器中使用自定义应用程序栏设计了此布局,以实现显示的效果。
@override
Widget build(BuildContext context) {
return Scaffold(
body: NestedScrollView(
headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
return [
TransitionAppBar(
title: Container(
margin: EdgeInsets.symmetric(horizontal: 20.0, vertical: 0),
decoration: BoxDecoration(
color: Colors.grey[200],
borderRadius: BorderRadius.all(Radius.circular(5.0))),
child: Row(children: <Widget>[
Padding(
padding: EdgeInsets.only(left: 20.0, right: 10.0),
child: Icon(Icons.search)),
Expanded(
child: TextFormField(
decoration: InputDecoration(
hintText: "Search",
border: InputBorder.none)))
])))
];
},
body: ListView.builder(
itemBuilder: (BuildContext context, int index) {
return ListTile(
title: Text("${index}"),
);
},
),
),
);
}
class TransitionAppBar extends StatelessWidget {
final Widget title;
const TransitionAppBar({this.title, Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
return SliverPersistentHeader(
pinned: true, delegate: _TransitionAppBarDelegate(title: title));
}
}
class _TransitionAppBarDelegate extends SliverPersistentHeaderDelegate {
final _titleMarginTween = EdgeInsetsTween(
begin: EdgeInsets.only(top: 100.0 + 5.0),
end: EdgeInsets.only(top: 10.0 + 50.0 + 5.0),
);
final _titleAlignTween =
AlignmentTween(begin: Alignment.center, end: Alignment.topCenter);
final Widget title;
_TransitionAppBarDelegate({this.title}) : assert(title != null);
@override
Widget build(
BuildContext context, double shrinkOffset, bool overlapsContent) {
final progress = shrinkOffset / 200.0;
final titleMargin = _titleMarginTween.lerp(progress);
final titleAlign = _titleAlignTween.lerp(progress);
return Stack(
children: <Widget>[
AnimatedContainer(
duration: Duration(milliseconds: 100),
height: progress * 110,
color: Colors.redAccent,
),
Padding(
padding: titleMargin,
child: Align(
alignment: titleAlign,
child: title,
),
)
],
);
}
@override
double get maxExtent => 180.0;
@override
double get minExtent => 150.0;
@override
bool shouldRebuild(_TransitionAppBarDelegate oldDelegate) {
return title != oldDelegate.title;
}
}
此代码工作正常,但目前您可以在下面的屏幕截图中看到,列表的第一个元素(即 0)位于搜索文本表单字段的后面。但是我要实现的是在Transition App Bar动画完成后滚动列表。
解决方案
推荐阅读
- php - 如何显示 php myadmin 记录数
- python - 如何减少 OpenCV python 中的帧数?
- regex - RegEx 用于出现一个常量,后跟任何字符串,直到空格或字符串结尾
- c# - 添加文本的次数与文本中的字符数一样多
- c - 根据文件大小分配内存没有正确的数字?
- html - justify-content 和 flex-grow 被忽略
- python-3.x - 在 python 中加载 .db 文件时出现“没有这样的表”错误
- vba - 如何优化/加速此代码,以便我可以处理大数据集?
- r - 抑制 tm_shape() 函数的消息(来自 tmap 库)
- angular - 后续的属性声明必须有相同的类型错误:node_modules/@types/jquery/index.d.ts