Flutter-BLoC模式-如何使用流调用另一个小部件的方法(即动画)?

时间:2018-11-23 09:25:37

标签: dart flutter rxdart

假设有一个具有控制可见性动画toggleVisibility()的方法的小部件。在BLoC模式中,我想使用流来调用该函数。我觉得这很棘手。

  1. 由于它是动画而不是完整的重绘,因此StreamBuilder不适合。
  2. 向BLoC流中手动添加侦听器也不方便。

    1. 在目标小部件的initeState()函数中,我们没有上下文,因此很难获得对BLoC的引用。

    编辑:当我阅读Rémi Rousselet's answer之后,情况并非如此。我们甚至可以在build()函数外部访问上下文,因为State<T>类具有一个名为'context'的属性,并且在Flutter的文档中进行了记录。...我对此并不了解。

    1. 在目标窗口小部件的build(context)函数中,我们具有上下文。但是小部件可以经常重新构建,因此您必须手动清除过时的订阅。否则会产生大量垃圾。
  3. StreamBuilder可以做到,因为StreamBuilder已实现了所有订阅和取消订阅功能。在目标小部件的布局中的某处插入StreamBuilder。

    StreamBuilder( stream: Bloc.of(context).stream, builder: (context, snapshot){ toggleVisiblity(); return Container(): } );

但这确实是一个hack。它混合了布局和逻辑,并引入了一个无用的小部件,它可能会导致布局错误。

所以我想知道是否有一种很好的方法来扑朔迷离。

1 个答案:

答案 0 :(得分:3)

您不能使用StreamBuilder来做到这一点。您必须手动收听视频流

class Example extends StatefulWidget {
  @override
  ExampleState createState() => ExampleState();
}

class ExampleState extends State<Example> {
  StreamSubscription subscription;

  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
    Stream stream = Bloc.of(context).foo;
    subscription?.cancel();
    subscription = stream.listen((value) {
      // do something
    });
  }

  @override
  void dispose() {
    subscription?.cancel();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Container();
  }
}