我在Flutter Web项目中运行以下代码
void initState() {
reloadTimer = Timer.periodic(
const Duration(seconds: 30),
(timer) => setState(() {
Fimber.d('setting state in widget');
}),
);
super.initState();
}
@override
Widget build(BuildContext context) => StreamBuilder<List<Timetable?>>(
stream: widget.service
.getTimetable()
.where((list) => list.isNotEmpty),
builder: (context, snapshot) => Column(
// ...
),
);
流是这样创建的
@override
Stream<List<Timetable?>> getTimetable() {
final minDateEpoch = DateTime.now()
.subtract(const Duration(minutes: 5))
.millisecondsSinceEpoch;
Fimber.d('getting new stream for ${minDateEpoch.toString()}');
return FirebaseFirestore.instance
.collection('rides')
.where('canceled', isEqualTo: false)
.where('departureTimeEpoch', isGreaterThan: minDateEpoch)
.orderBy('departureTimeEpoch')
.limit(100)
.snapshots()
.asyncMap((element) => element.toTimetableList());
}
现在我拿到的日志里
2022-12-14T15:38:34.867 D Flutter: getting new stream for 1671028414658
2022-12-14T15:39:04.704 D Flutter: setting state in widget
2022-12-14T15:39:34.727 D Flutter: setting state in widget
2022-12-14T15:40:04.734 D Flutter: setting state in widget
这表明setState
已经运行,但是流还没有重新创建,尽管setState
应该重新创建整个小部件,因此也重新创建流。
顺便说一句,我知道这个例子在某种程度上是无稽之谈,在我的真实的项目中,我想每3-4个小时重新创建一次流。
1条答案
按热度按时间5t7ly7z51#
在您当前的代码中,
StreamBuilder
小部件不依赖于状态,因为您在stream
参数中使用了widget.service...
,小部件本身是不可变的(只有它的状态可以改变),因此setState
不会有任何影响。相反,在state类中声明一个迟到成员:
在
initState
中为其赋值:在
StreamBuilder
中使用此成员:在此之后,如果您在
setState
中为_stream
分配一个新值,它将触发重建: