假设有一个小部件,它有一个控制可见性动画的方法toggleVisibility()
。在BLoC模式中,我希望使用流来调用该函数。我觉得这很棘手。
- 由于它是一个动画而不是一个完整的重绘,因此StreamBuilder不适合
-
手动向BLoC流添加侦听器也不方便。
- 在目标小部件的
initeState()
函数中,我们没有上下文,因此很难获得对BLoC的引用
编辑:在我阅读了雷米·罗塞莱特的答案后,情况并非如此。我们甚至可以在
build()
函数之外访问上下文,因为State<T>
类有一个名为"context"的属性,并且在Flutter的文档中有文档记录。。。。我不知道- 在目标小部件的
build(context)
函数中,我们有上下文。但是小部件可以频繁地重新构建,因此您必须手动清理过时的订阅。否则会产生大量垃圾
- 在目标小部件的
- 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();
}
}