我正在开发一个应用程序,当网络中断时,它可以在顶部显示一个“无连接”小部件。由于我的应用程序本身没有“前额”部分,我只是在树中添加了一个小部件(更准确地说,我使appBar出现)。
这种解决方案的问题是,即使使用ShowUpAnimation
,当小部件出现时,空间也会立即被占用。这会残酷地取代所有元素,它看起来非常不稳定和糟糕。下面是它的样子,请原谅我的字面法语:
我正在寻找一个解决这个问题的方法,它可以让我轻松地使用过渡窗口小部件,在一定时间内轻轻地向下推屏幕的其余部分,使其看起来更平滑。此外,我目前的解决方案不处理窗口小部件退出,它只是消失,这是更不和谐。
先谢谢你了!
验证码:
如何在Scaffold中调用应用程序栏:
appBar: !viewModel.hasConnection
? const PreferredSize(
preferredSize: Size.fromHeight(35),
child: NoConnectionAppBar(),
) : null
viewModel.hasConnection
会自动更新为Stream。
如何在类中实现应用程序栏:
Widget build(BuildContext context) {
return ShowUpAnimation(
curve: Curves.linear,
offset: -0.5,
child: AppBar(...)
);
}
3条答案
按热度按时间e37o9pze1#
您也可以使用
AnimatedContainer
代替AppBar
,并将其放置在所有其他Widget之上。这提供了高度可以动画的优势,因此其他Widget可以随着AnimatedContainer
使用的空间向下滑动。更多信息见这里:AnimatedContainer
pqwbnv8z2#
如果你想坚持使用
AppBar
,你应该考虑使用像SliverAppBar
这样的东西,它有expandedHeight
属性,你可以设置它的高度并在事件中更改它。注意
SliverAppBar
应该放在 scrollview 里面,属性为slivers
,例如--CustomScrollView
更多信息:
SliverAppBar(官方)
CustomScrollView(官方)
unofficial guide可能会对您有所帮助
muk1a3rh3#
以下是我的回答,有两种情况:
在第一种情况下,bar需要在屏幕上占用一些垂直空间。所以我删除了appBar,而是将
Scaffold
Package 在Expanded中,然后 Package 在Column中。在控制器中,我定义了一个名为topBarWidget
的变量。当控制器创建时,我们初始化那个小部件,要么是我的无连接条,要么是一个0高度的SizedBox。我们还将这个逻辑连接到处理连接检测的函数。最后,我在Column的顶部添加了一个AnimatedSize
小部件,并将topBarWidget作为子部件。效果很好,但要确保Column被 Package 在安全区域中。在第二种情况下,我发现我不需要我的小部件来占用垂直空间,所以我只是在控制器中添加了相同的逻辑来定义一个topBarWidget。然后,我用一个使用
SizeTransition
的转换构建器将该topBarWidget Package 在AnimatedSwitcher
中。你会发现代码的结果。谢谢@dstreissi把我放在正确的轨道上。
1 -占用垂直空间
2 -在Z轴上堆叠
请注意我是如何将ScrollView放在Stack中的,这样即使向下滚动,noConnection消息也会停留在屏幕的顶部。