如何为 StreamBuilder 生成的小部件设置动画?

Posted

技术标签:

【中文标题】如何为 StreamBuilder 生成的小部件设置动画?【英文标题】:How to animate widget generated by StreamBuilder? 【发布时间】:2019-08-06 05:15:31 【问题描述】:

我正在尝试使用 StreamBuilder 生成屏幕内容。它在 bloc 模式下运行良好,但有一件事我正在努力解决。 如何对生成的内容(WidgetA 和 WidgetB)之间的变化进行动画处理,如淡入淡出或滑动效果?

    ...
    return AnimatedSwitcher(
      duration: Duration(seconds: 4),
      child: BlocBuilder<ContentEvent, int>(
        bloc: bloc,
        builder: (context, contentID) 
          if (contentID == 1) 
            return WidgetA();
           else 
            return WidgetB();
          
        ,
      ),
    );
    ...

【问题讨论】:

AnimatedSwitcher @pskink 我已经尝试过这种方法,但是当 BlocBuilder 被包裹在 AnimatedSwitcher 中时,它根本没有动画。 AnimatedSwitcher 工作正常,然后发布您的代码 @pskink 我很可能用错了。 :) 我已经用我当前的 AnimatedSwitcher 解决方案更新了帖子中的代码。 试试:builder: (context, contentID) return AnimatedSwitcher(...); 【参考方案1】:

你可以试试 AnimatedCrossFade 它接受 2 个孩子,持续时间和状态(AnimatedCrossFadeState.showFirst 和 AnimatedCrossFadeState.showSecond),它会在两个孩子之间动画淡入淡出。

文档:https://docs.flutter.io/flutter/widgets/AnimatedCrossFade-class.html

【讨论】:

【参考方案2】:

您的 BlocBuilder 应该包裹 AnimatedSwitcher 而不是相反。

AnimatedSwitcher 的动画发生在其直接子级更改时。但在你的情况下,直接孩子是 always BlocBuilder

StreamBuilder(
  stream: stream,
  builder: (context, snapshot) 
    return AnimatedSwitcher(
      duration: const Duration(seconds: 4),
      child: snapshot.hasData
        ? Text(snapshot.data)
        : CircularProgressIndicator();
    );
  
),

【讨论】:

谢谢!这个我找了很久 请注意,如果类型相同(例如,如果您将切换器的小部件包装在 Container 或 Centre 中),则除非您给它们不同的键,否则动画不会发生。见api.flutter.dev/flutter/widgets/AnimatedSwitcher-class.html

以上是关于如何为 StreamBuilder 生成的小部件设置动画?的主要内容,如果未能解决你的问题,请参考以下文章

在 StreamBuilder 中使用 Selector (Provider) 时不必要的小部件重建

如何为我的小部件添加边距?了解 EdgeInsets 的效果

Flutter:如何为 StreamBuilder 制作 http 流

QT Creator:如何为自定义小部件生成库和测试可执行文件

如何为通知中心全宽制作 iOS 应用扩展?

在 Flutter 中从 Firebase FireCloud 接收数据时,StreamBuilder 中的快照代码不会被执行