1

我有一个 StreamController 应该更新 aList但它没有发生:

class LocationService {
    StreamController<List<bg.Geofence>> geofencesController = StreamController<List<bg.Geofence>>();

    updateGeofences(geofences) {
        logger.i('listing geofences $geofences');
        geofencesController.add(List.from(list));
    }
}

当我打电话时,updateGeofences我在日志中有很多地理围栏。但是小部件没有重建!

这是我的提供商设置:

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MultiProvider(
        providers: [
          StreamProvider<List<bg.Geofence>>.value(
              updateShouldNotify: (_, __) {
                logger.i('updateShouldNotify, $_, $__');
                return true;
              },
              initialData: List<bg.Geofence>(),
              stream: LocationService().geofencesController.stream)
        ],
        child: MaterialApp()
     );
  }
}

当我直接从我的服务中收听时

geofencesController.stream.listen((onData) {
  logger.i('Got eem! $onData');
});

流发出新数据......但不是在 StreamProvider:updateShouldNotify中:从未被调用(我没有运气尝试过这个答案的解决方案)

以下是我查看数据的方式:

class GPSView extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    List<bg.Geofence> geofences = Provider.of<List<bg.Geofence>>(context);

但是这个列表仍然是空的。

我有另一个带有简单 Map 的 StreamController 可以完美运行。怎么了?

4

1 回答 1

1

所以感谢@pskink 和@RémiRoussele 的评论,我设法解决了我的问题:

我正在LocationService通过调用重新创建一个LocationService().geofencesController.stream.

我将我的代码更新为

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MultiProvider(
        providers: [
          StreamProvider<List<bg.Geofence>>(
            builder: (_) => locator<LocationService>().geofencesController,
            initialData: List<bg.Geofence>(),
          ),
        ],
        child: MaterialApp();
  }
}

现在一切正常!干杯!

于 2019-09-04T13:08:43.450 回答