【发布时间】:2020-04-17 19:15:34
【问题描述】:
我很难理解为什么我的 Stateful 小部件在重建后没有更新状态。我有一个有状态的小部件负责每秒递减一个计数器,所以它接收一个初始值,我将这个初始值传递给 State 并开始递减它。
它还有一个按钮,按下该按钮时会向我的块发送一个事件,该事件会使用新的初始值重建有状态的小部件,事实是,它确实发送并更新了初始值,但计数器继续递减旧值和我不知道为什么。这里是代码示例:
小部件
void main() => runApp(
BlocProvider(
create: (context) => TBloc(),
child: MaterialApp(
home: Scaffold(
body: BlocBuilder<TBloc, BState>(
builder: (context, state) {
if (state is BState) {
return Column(
children: [
Counter(state.value),
FlatButton(
child: Text("tap"),
onPressed: () =>
BlocProvider.of<TBloc>(context).add(BEvent(200)),
),
],
);
}
return Container();
},
),
),
),
),
);
class Counter extends StatefulWidget {
final int initialValue;
Counter(this.initialValue);
@override
CounterState createState() => CounterState(this.initialValue);
}
class CounterState extends State<Counter> {
Timer timer;
int value;
CounterState(this.value);
@override
void initState() {
super.initState();
timer = Timer.periodic(Duration(seconds: 1), (timer) {
setState(() => --value);
});
}
@override
Widget build(BuildContext context) {
return Column(
mainAxisSize: MainAxisSize.min,
children: [
Text("Value: $value"),
Text("Initial: ${widget.initialValue}")
],
);
}
}
集团
class TBloc extends Bloc<BEvent, BState> {
@override
BState get initialState => BState(100);
@override
Stream<BState> mapEventToState(BEvent event) async* {
yield BState(event.value);
}
}
class BEvent extends Equatable {
final int value;
BEvent(this.value);
@override
List<Object> get props => [value];
}
class BState extends Equatable {
final int value;
BState(this.value);
@override
List<Object> get props => [value];
}
提前谢谢你。
【问题讨论】: