The BlocBuilder
有一个可选参数condition
有类型的bool Function(State previous, State current)
,你需要返回true
如果你想要小部件调用builder
函数,以及false
如果你不想的话。该参数是可选的,默认为true
.
因为在condition
参数你有previous
国家和current
状态您可以比较该状态的属性并返回true
如果它满足您的比较。
请记住,您需要覆盖==
运算符和hashCode
您的状态以及在您的状态类中使用的所有类。简单的方法是使用可等同的 https://github.com/felangel/equatable.
在你的情况下,你需要有一个State
像这样:
class MyState extends Equatable {
final bool isPullingState;
final List<MyClass> dataList;
MyState(this.isPullingState, this.dataList)
: super([isPullingState, dataList]);
}
class MyClass extends Equatable {
final int property1;
final int property2;
MyClass(this.property1, this.property2)
: super([
property1,
property2,
]);
}
然后在你的小部件中你可以设置你想要的条件:
@override
Widget build(BuildContext context) {
return Column(
children: <Widget>[
BlocBuilder(
bloc: myBloc,
condition: (MyState previous, MyState current) =>
previous.isPullingState != current.isPullingState,
builder: (BuildContext context, MyState state) {
// this function is only called when isPullingState change
return MyIsPullingWidget();
},
),
BlocBuilder(
bloc: myBloc,
condition: (MyState previous, MyState current) =>
previous.dataList != current.dataList,
builder: (BuildContext context, MyState state) {
// this function is only called when the dataList change
return MyListWidget(state.dataList);
},
),
BlocBuilder(
bloc: myBloc,
builder: (BuildContext context, MyState state) {
// this function is called in each state change
return MyListWidget(state.dataList);
},
),
],
);
}