最好的方法来缓解一个小部件与Flutter?

7gs2gvoe  于 2023-04-07  发布在  Flutter
关注(0)|答案(3)|浏览(119)

我正在开发一个应用程序,当网络中断时,它可以在顶部显示一个“无连接”小部件。由于我的应用程序本身没有“前额”部分,我只是在树中添加了一个小部件(更准确地说,我使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(...)
     );
}
e37o9pze

e37o9pze1#

您也可以使用AnimatedContainer代替AppBar,并将其放置在所有其他Widget之上。这提供了高度可以动画的优势,因此其他Widget可以随着AnimatedContainer使用的空间向下滑动。
更多信息见这里:AnimatedContainer

pqwbnv8z

pqwbnv8z2#

如果你想坚持使用AppBar,你应该考虑使用像SliverAppBar这样的东西,它有expandedHeight属性,你可以设置它的高度并在事件中更改它。

注意SliverAppBar应该放在 scrollview 里面,属性为slivers,例如--CustomScrollView

更多信息:
SliverAppBar(官方)
CustomScrollView(官方)
unofficial guide可能会对您有所帮助

muk1a3rh

muk1a3rh3#

以下是我的回答,有两种情况:
在第一种情况下,bar需要在屏幕上占用一些垂直空间。所以我删除了appBar,而是将Scaffold Package 在Expanded中,然后 Package 在Column中。在控制器中,我定义了一个名为topBarWidget的变量。当控制器创建时,我们初始化那个小部件,要么是我的无连接条,要么是一个0高度的SizedBox。我们还将这个逻辑连接到处理连接检测的函数。最后,我在Column的顶部添加了一个AnimatedSize小部件,并将topBarWidget作为子部件。效果很好,但要确保Column被 Package 在安全区域中。
在第二种情况下,我发现我不需要我的小部件来占用垂直空间,所以我只是在控制器中添加了相同的逻辑来定义一个topBarWidget。然后,我用一个使用SizeTransition的转换构建器将该topBarWidget Package 在AnimatedSwitcher中。
你会发现代码的结果。谢谢@dstreissi把我放在正确的轨道上。

1 -占用垂直空间

SafeArea(
    child: Column(
        children: [
            AnimatedSize(
                duration: const Duration(milliseconds: 800),
                curve: Curves.easeIn,
                child: viewModel.topBarWidget,
            ),
            Expanded(
                child: Scaffold(...),
            ),...,
);

2 -在Z轴上堆叠

SafeArea(
            child: Scaffold(
              ...
              body: Stack(
                children: [
                  SingleChildScrollView(
                    child: Column(
                      children: [...],
                    ),
                  ),
                  AnimatedSwitcher(
                    duration: const Duration(milliseconds: 800),
                    transitionBuilder: (Widget child,
                    Animation<double> animation) => SizeTransition(sizeFactor: animation, child: child,),
                    child: viewModel.topBarWidget,
                  ),
                ],
              ),
            ),
          );

请注意我是如何将ScrollView放在Stack中的,这样即使向下滚动,noConnection消息也会停留在屏幕的顶部。

相关问题