- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我希望这些动画之间能够平滑,我尝试使用 AnimatedSize
、AnimatedOpacity
和 AnimatedPositioned
但出现了一些错误。我不知道如何将它们与 SliverAppBar
一起使用。在其他示例中,我看到人们使用 LayoutBuilder
但他们没有共享完整的代码,因此我无法测试它。我将分享我的代码片段,但它在两种状态之间有一个非常奇怪的转换。
我希望CircleAvatar
变小并改变位置我希望 Icon(Icons.arrow_back)
和 Text('Previous Page')
消失。我也希望我的名字和工作消失。我希望这三个Containers
变小并改变位置。
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Dialog Demo',
debugShowCheckedModeBanner: false,
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: Scaffold(
body: CustomScrollView(
slivers: [
SliverAppBar(
elevation: 0,
pinned: true,
expandedHeight: 190,
collapsedHeight: kToolbarHeight + 8,
flexibleSpace: FlexibleSpaceBar(
collapseMode: CollapseMode.none,
centerTitle: true,
titlePadding: EdgeInsetsDirectional.only(
start: 20.0,
end: 20.0,
top: 12.0,
bottom: 12.0,
),
title: SafeArea(
child: Column(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
CircleAvatar(
radius: 16,
),
Row(
children: [
Container(
decoration: BoxDecoration(
color: Colors.white10,
borderRadius: BorderRadius.all(
Radius.circular(12),
),
),
padding: EdgeInsets.all(8.0),
child: Icon(Icons.person),
),
SizedBox(
width: 8,
),
Container(
decoration: BoxDecoration(
color: Colors.white10,
borderRadius: BorderRadius.all(
Radius.circular(12),
),
),
padding: EdgeInsets.all(8.0),
child: Icon(Icons.menu),
),
SizedBox(
width: 8,
),
Container(
decoration: BoxDecoration(
color: Colors.white10,
borderRadius: BorderRadius.all(
Radius.circular(12),
),
),
padding: EdgeInsets.all(8.0),
child: Icon(Icons.message),
),
],
),
],
),
],
),
),
background: SafeArea(
child: Column(
children: [
Container(
alignment: Alignment.topLeft,
child: Row(
children: [
IconButton(
icon: Icon(Icons.arrow_back),
onPressed: () {},
),
Text(
'PREVIOUS PAGE',
style: TextStyle(
fontSize: 12,
fontWeight: FontWeight.bold,
),
),
],
),
),
Padding(
padding: const EdgeInsets.only(
left: 20,
top: 12,
bottom: 24,
),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
CircleAvatar(
radius: 20,
),
SizedBox(
width: 12,
),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'Sertan Hakkı İmamoğlu',
style: TextStyle(
fontSize: 18,
color: Colors.white,
fontWeight: FontWeight.bold,
),
),
Text(
'Student',
style: TextStyle(
fontSize: 14,
color: Colors.grey,
),
),
SizedBox(
height: 12,
),
Row(
children: [
Container(
decoration: BoxDecoration(
color: Colors.white10,
borderRadius: BorderRadius.all(
Radius.circular(12),
),
),
padding: EdgeInsets.symmetric(
horizontal: 34,
vertical: 12,
),
child: Icon(Icons.menu),
),
SizedBox(
width: 4,
),
Container(
decoration: BoxDecoration(
color: Colors.white10,
borderRadius: BorderRadius.all(
Radius.circular(12),
),
),
padding: EdgeInsets.symmetric(
horizontal: 34,
vertical: 12,
),
child: Icon(Icons.person),
),
SizedBox(
width: 4,
),
Container(
decoration: BoxDecoration(
color: Colors.white10,
borderRadius: BorderRadius.all(
Radius.circular(12),
),
),
padding: EdgeInsets.symmetric(
horizontal: 34,
vertical: 12,
),
child: Icon(Icons.message),
),
],
)
],
)
],
),
),
],
),
),
),
),
SliverList(
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
return Container(
color: index.isOdd ? Colors.white : Colors.black12,
height: 100.0,
child: Center(
child: Text('$index', textScaleFactor: 5),
),
);
},
childCount: 20,
),
),
],
),
),
);
}
}
最佳答案
根据 pskink 的建议,这是我对您的问题的看法我使用了 SliverPercientHeader
并尝试使其具有响应能力,因此当尺寸减小时,它会出现一些动画。
class CustomPageHeader extends SliverPersistentHeaderDelegate {
CustomPageHeader({
required double collapsedHeight,
required double expandedHeight,
}) : minExtent = collapsedHeight, maxExtent = expandedHeight;
@override
final double minExtent;
@override
final double maxExtent;
Widget _buildBtn(IconData icon, double scale) {
double horizontal = 34.0 * scale;
horizontal = horizontal < 8 ? 8.0 : horizontal;
double vertical = 12.0 * scale;
vertical = vertical < 8 ? 8.0 : vertical;
return Container(
decoration: const BoxDecoration(
color: Colors.white10,
borderRadius: BorderRadius.all(
Radius.circular(12),
),
),
padding: EdgeInsets.symmetric(horizontal: horizontal, vertical: vertical),
child: Icon(icon),
);
}
@override
Widget build(
BuildContext context, double shrinkOffset, bool overlapsContent) {
final theme = Theme.of(context);
final backgroundColor =
theme.appBarTheme.backgroundColor ?? theme.colorScheme.primary;
final scale = 1 - shrinkOffset / maxExtent;
final isReduced = shrinkOffset >= maxExtent * 0.12;
final wrappedBtns = Wrap(
spacing: 8,
children: [
_buildBtn(Icons.menu, scale),
_buildBtn(Icons.person, scale),
_buildBtn(Icons.message, scale),
],
);
double avatarRadius = 20.0 * scale;
avatarRadius = avatarRadius > 16 ? avatarRadius : 16.0;
return Container(
padding: const EdgeInsets.only(
left: 20,
top: 12,
bottom: 12,
),
color: backgroundColor,
child: Column(
children: [
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
CircleAvatar(radius: avatarRadius),
!isReduced
? const SizedBox(width: 12)
: Expanded(child: Container()),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
if (!isReduced)
Text(
'Sertan Hakkı İmamoğlu',
style: TextStyle(
fontSize: 18 * scale,
color: Colors.white,
fontWeight: FontWeight.bold,
),
),
if (!isReduced)
Text(
'Student',
style: TextStyle(
fontSize: 14 * scale,
color: Colors.grey,
),
),
],
),
if (isReduced) wrappedBtns,
],
),
Flexible(
child: Container(
constraints: const BoxConstraints(maxHeight: 12),
),
),
if (!isReduced) wrappedBtns,
],
),
);
}
@override
bool shouldRebuild(_) => true;
}
在您的条子列表中使用它,如下所示:
SliverPersistentHeader(
pinned: true,
delegate: CustomPageHeader(
collapsedHeight: kToolbarHeight + 8,
expandedHeight: 190,
),
),
Try the full test code on DartPad
该代码是完美的,但应该对您有足够的帮助,以便您可以改进它并自己继续。
关于flutter - 我怎样才能有一个像这样的动画SliverAppBar?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68903417/
我想实现如下布局: Layout Link 到目前为止,我正在使用 Sliver。但问题是SearchBar!我希望 SliverAppBar 与布局完全一样并固定在顶部。有什么建议吗? 我试图通过此
我在 sliver 应用栏及其内容方面遇到了一些问题。当我向下滚动 SliverList 的内容(在下面的代码中)时,我想调整 flexibleSpace 中的图像大小,以适应列表顶部元素的图像。 现
我在SliverAppBar中使用flexibleSpace,其中包含以下内容: float :true,固定:false,捕捉:true:当我向上滚动时。它显示AppBar和flexibleSpac
我将 Flutter 的 SliverAppBar 与 SliverList 结合使用。应用栏可以很好地处理长列表,滚动很多。但是,如果我有包含 8 个项目的中等大小列表,则应用栏只会部分折叠,直到列
我有一个 SliverAppBar,向上滚动可缩小,向下滚动可展开。 我想在切换 BottomNavigationBar 时扩展 SliverAppBar。 当前情况下,SliverAppBar保持切
我已按照本教程 (https://medium.com/@diegoveloper/flutter-collapsing-toolbar-sliver-app-bar-14b858e87abe) 创建
我有一个 SliverAppBar( float :true,固定:false)。 我想实现的是,在 SliverAppBar 开始压缩/向上滑动之前,用户必须滚动 200 像素(或其他数量)。 最佳
当 AppBar 重新设置动画时(滚动条到达顶部后),SliverAppBar 无法显示内容。 下面包含一个示例项目来演示该问题。复制/粘贴下面的代码(将 rxdart 依赖项添加到 pubspec.
This is what I'm trying to do ,它是 iOS 上一个相当常见的 Widget。这是我的代码: return Scaffold( backgroundColor: Co
我正在使用 NestedScrollView在这里并试图放一个 TabBar在 bottom SliverAppBar 的参数内置于 headerSliverBuilder功能。 TabBar工作正常
我想在 Flutter 中添加自定义 SliverAppBar,如下所示 The SliverAppBar I want 但我只能做如下 The SliverAppBar I get在 https:/
我收到了 SliverAppBar与 AnimatedContainer里面。此动画容器的高度在运行时会发生变化,因此容器会对其大小进行动画处理。我的问题是,expandedHeight我的 Sliv
我对 Appbar 有这些要求,但我找不到解决它们的方法。 当拉伸(stretch) , AppBar 必须显示 两个图像一个在另一个之上并且标题必须隐藏。 当关闭 , AppBar 必须显示标题和
我在 Dribble 中发现了一些 Appbar 设计 https://dribbble.com/shots/9175650-Beauty-Salon-App/attachments/1218583?
我正在尝试在自定义应用栏下方显示一个灵活的 SliverAppBar(假设它是一个高度为 80.0 的容器)。 当将 SliverAppBar 设置为顶部元素时,它工作正常,但当它是第二个时,顶部填充
我显示来自网络的图像,它在滚动时缩小。我想显示没有填充或裁剪的整个图像。但是,如果我用 expandedHeight 注释行 - 没有图像 - 只有 appbar 及其高度。有没有什么小部件,可以根据
我是使用 flutter 的新手,当我编写我的应用程序时,我遇到了一个问题,即如何默认设置 SliverAppBar 折叠状态。为了解决我的困惑,我查看了 flutter 的文档,不幸的是我找不到解决
有没有人在SliverAppBar中使用过Gradient?当它展开时,我可以在 FlexibleSpace 中执行此操作,但当它折叠时,它会变成纯色。可以治疗吗? 最佳答案 在FlexibleSpa
在 Flutter 中,您可以使用 shape 属性在 AppBar 小部件中自定义形状,但此属性在 SliverAppBar 小部件中缺失 AppBar( title: Text('He
这是我的代码,复制自 here : SliverAppBar( expandedHeight: 150.0, flexibleSpace: const FlexibleSpaceBar(
我是一名优秀的程序员,十分优秀!