StreamProvider未更新列表

时间:2019-09-04 12:39:03

标签: flutter dart flutter-provider

我有一个StreamController,它应该更新List,但不会发生:

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(我很幸运地尝试过此answer's解决方案)

这是我查看数据的方式:

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

但此列表为空。

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

1 个答案:

答案 0 :(得分: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();
  }
}

现在一切正常!干杯!