flutter 设置状态时未重新创建StreamBuilder中的流

ryevplcw  于 2022-12-19  发布在  Flutter
关注(0)|答案(1)|浏览(127)

我在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个小时重新创建一次流。

5t7ly7z5

5t7ly7z51#

在您当前的代码中,StreamBuilder小部件不依赖于状态,因为您在stream参数中使用了widget.service...,小部件本身是不可变的(只有它的状态可以改变),因此setState不会有任何影响。
相反,在state类中声明一个迟到成员:

late Stream<List<Timetable?>> _stream;

initState中为其赋值:

@override
void initState() {
  super.initState();
  _stream = widget.service.getTimetable...
}

StreamBuilder中使用此成员:

stream: _stream,

在此之后,如果您在setState中为_stream分配一个新值,它将触发重建:

setState(() => _stream = widget.service.getTimetable...);

相关问题