flutter - Flutter - 在导航期间创建固定 AppBar 的最佳实践是什么
问题描述
在原生android开发中,常用FragmentTransaction
来创建导航动画,其中actionBar的位置是固定的(但是actionBar的内容发生了变化),actionBar下面的fragment会执行一个过渡动画(比如滑入滑出)。
简单来说,AppBar
和body执行不同的过渡动画。在颤振中,创建此类动画的最佳实践是什么?
目前我可以想到一个使用导航Scaffold.body
并使用Stream
+StreamBuilder
开始AppBar
重绘的解决方案。类似于以下代码。
Scaffold(
appBar: StreamBuilder<Int>(
stream: Bloc.of(context).currentFragmentId
builder: //Some logic to decide which AppBar is appropriate
),
body: Navigator(
//Navigation between fragments
),
)
但这真的很奇怪。那么有没有最佳实践来做到这一点?请告诉我!
解决方案
好吧,因为目前没有可用的答案。我将在这里分享我的解决方案,虽然它不是那么优雅。
解决方案是将 AppBar 包装在 Hero 小部件中。由于 Scaffold 仅将 PreferedSize 小部件用作应用栏,因此需要进行一些自定义。
class HeroAppBar extends StatelessWidget implements PreferredSizeWidget {
//...
@override
final Size preferredSize = Size.fromHeight(kToolbarHeight + (bottom?.preferredSize?.height ?? 0.0));
//...
@override
Widget build(BuildContext context) {
return Hero(
tag: tag,
child: AppBar(
//...
),
);
}
}
并确保您的 Navigator 实现了 HeroController。(Default Navigator 已经实现了)
推荐阅读
- ios - Swift PDFKit:无法将视图缩放到小尺寸
- html - 字体显示不正确
- python - 如何通过套接字连接使 qml 对象的属性“动态更新”?
- mysql - 如何修复linux中使用nodejs连接数据库的错误?
- typescript - 使用 new() 签名声明接口,现在当我将接口用作对象时,它会为我提供函数属性?
- android - 如何在启动序列完成后创建启动服务的应用程序?
- sqlite - SQLite AUTOINCREMENT 非主键列
- javascript - JavaScript 自上一个日期/时间以来经过的时间
- azure - 首次应用后未输出 Terraform Azure mac 地址
- sails.js - Remove Fields when query at sails js