4

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

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

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

    编辑:在我阅读Rémi Rousselet 的回答后,情况并非如此。我们甚至可以在build()函数之外访问上下文,因为State<T>类有一个名为“上下文”的属性,并且记录在 Flutter 的文档中......我不知道这一点。

    1. build(context)目标小部件的功能中,我们有上下文。但是小部件可以经常重新构建,因此您必须手动清理过时的订阅。否则会产生大量垃圾。
  3. 可以使用 StreamBuilder 进行破解,因为 StreamBuilder 已经实现了所有订阅和取消订阅功能。在目标小部件的布局中的某处插入 StreamBuilder。
StreamBuilder(
    stream: Bloc.of(context).stream,
    builder: (context, snapshot){
        toggleVisiblity();
        return Container():
    }
);

但这真的是一个黑客。它将布局与逻辑混合在一起,并引入了一个可能导致布局错误的无用小部件。

所以我想知道在颤振中是否有一种很好的方法来做到这一点。

4

1 回答 1

11

你不能用它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).someStream;
    subscription?.cancel();
    subscription = stream.listen((value) {
      // do something
    });
  }

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

  @override
  Widget build(BuildContext context) {
    return Container();
  }
}
于 2018-11-23T09:55:42.730 回答