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



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

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

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

    编辑:在我阅读了雷米·罗塞莱特的答案后,情况并非如此。我们甚至可以在build()函数之外访问上下文,因为State<T>类有一个名为"context"的属性,并且在Flutter的文档中有文档记录。。。。我不知道

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

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

所以我想知道是否有一个好的方法来做到这一点。

您不能使用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();
}
}

最新更新