假设有一个具有控制可见性动画toggleVisibility()
的方法的小部件。在BLoC模式中,我想使用流来调用该函数。我觉得这很棘手。
向BLoC流中手动添加侦听器也不方便。
initeState()
函数中,我们没有上下文,因此很难获得对BLoC的引用。 编辑:当我阅读Rémi Rousselet's answer之后,情况并非如此。我们甚至可以在build()
函数外部访问上下文,因为State<T>
类具有一个名为'context'的属性,并且在Flutter的文档中进行了记录。...我对此并不了解。
build(context)
函数中,我们具有上下文。但是小部件可以经常重新构建,因此您必须手动清除过时的订阅。否则会产生大量垃圾。StreamBuilder可以做到,因为StreamBuilder已实现了所有订阅和取消订阅功能。在目标小部件的布局中的某处插入StreamBuilder。
StreamBuilder(
stream: Bloc.of(context).stream,
builder: (context, snapshot){
toggleVisiblity();
return Container():
}
);
但这确实是一个hack。它混合了布局和逻辑,并引入了一个无用的小部件,它可能会导致布局错误。
所以我想知道是否有一种很好的方法来扑朔迷离。
答案 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();
}
}