所以我有一个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通知时,列表都会更新
答案 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>
方法,将在initState
和didUpdateWidget()
上调用。
接下来,在我的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
中得到这个答案的人会得到帮助!