无法重建StreamProvider来更新其当前数据

时间:2019-07-28 13:27:26

标签: flutter dart

所以我有一个Consumer<NotificationProvider>,在其构建器函数中有一个StreamProvider<List<Item>>

请注意,后一个小部件可在其初始加载时完美构建。

NotificationProvider包含Firebase Cloud Messaging发出的通知列表,因此,收到通知后,我将某些内容推入类的List and then call notifyListeners()`中。

也请注意,我的NotificationProvider做得很好,因为我的AppBar处有一个计数器,并且每当收到一个计数器时都会更新。

现在是肉和土豆。

无论何时调用NotificationProvider.addAlert(),我都试图重建StreamProvider。但是不知道怎么办?

我还添加了updateShouldNotify: (prev, next) => true,,但这一点都没有帮助。

请帮助。谢谢!

我还在StreamProvider属性上添加了updateShouldNotify: (prev, next) => true,,但是它一点也没有帮助。

return Consumer<NotificationProvider>(
  builder: (context, provider, child) {
    return StreamProvider<ItemsProvider>(
      builder: (_) async* {
        ItemsProvider _itemsProvider = Provider.of<ItemsProvider>(context);
        await _itemsProvider.getItems();
        yield _itemsProvider;
      },
      child: LeContent(),
      updateShouldNotify: (prev, next) => true,
    );
  },
);

我希望每当收到FCM通知时,列表都会更新

2 个答案:

答案 0 :(得分:0)

builder参数在StreamProvider的整个生命周期中仅被调用一次。

您调用Provider.of<ItemsProvider>的事实在这里没有任何改变-即使ItemsProvider发生了更改,该方法也不会再次被调用。

如果您坚持使用StreamProvider,则需要以某种方式将Provider.of转换为流。

您可以使用StatefulWidget来这样做。这是一个示例:

class ProviderToStream<T> extends StatefulWidget {
  const ProviderToStream({Key key, this.builder, this.child}) : super(key: key);

  final ValueWidgetBuilder<Stream<T>> builder;
  final Widget child;

  @override
  _ProviderToStreamState<T> createState() => _ProviderToStreamState<T>();
}

class _ProviderToStreamState<T> extends State<ProviderToStream> {
  final StreamController<T> controller = StreamController<T>();

  @override
  void dispose() {
    controller.close();
    super.dispose();
  }

  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
    controller.add(Provider.of<T>(context));
  }

  @override
  Widget build(BuildContext context) {
    return widget.builder(context, controller.stream, widget.child);
  }
}

您可以执行以下操作:

ProviderToStream<Foo>(
  builder: (_, stream, __) {
    return StreamProvider(
      builder: (_) async* {
        await for (final value in stream) {
          // TODO: yield something
        }
      }
    );
  }
)

答案 1 :(得分:0)

我通过在StreamBuilder中加入StatefulWidget解决了自己的问题。

我将提取程序作为单独的Future<T>方法,将在initStatedidUpdateWidget()上调用。

接下来,在我的StatefulWidget类中,我需要用于didUpdateWidget()的{​​{1}}上进行验证的内容。

在我的情况下,我使用oldWidget.something != widget.something的长度,每次我的FCM配置触发该长度时,该长度都会增加。

使用代码:

NoticeProvider.notices

_fetchData,然后将调用api,转换JSON,然后使用 @override void didUpdateWidget(_Body oldWidget) { if (oldWidget.alertLength != widget.alertLength) _fetchData(); super.didUpdateWidget(oldWidget); } 将其添加到stream中,从而更新UI。

我希望在StreamController中得到这个答案的人会得到帮助!