flutter - StreamProvider未更新列表

标签 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,可以很好地工作。怎么了?

最佳答案

因此,由于@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();
  }
}

现在一切正常!干杯!

关于flutter - StreamProvider未更新列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57788589/

相关文章:

flutter - 我收到错误消息:在此设置小部件上方找不到正确的Provider <User>(已修复)

flutter - 如何使用 ProxyProvider 调用异步方法?

android - 可重新排序 ListView :Multiple widgets used the same GlobalKey

ruby - 在 mac 上安装、运行 FaSTLane for Flutter 时出错

android - 更新包后 Flutter Android 构建失败。安卓X错误

flutter - 如何在有条件的情况下调用提供者?

flutter - 无法将类型 'List<dynamic>' 的值分配给类型 'List<Todo>' 的变量。尝试改变变量的类型

firebase - 如何在 Flutter 中设置不同的 firebase 环境

dart - 如何将 flutter 连接到 Bluestacks 模拟器?

flutter - BoxConstraints 强制无限宽度