有一个国家提供商
final valueStateProvider = StateProvider<int>((ref) => 50);
显示情态动词的一个可能的解决方案是
Widget build(BuildContext context, WidgetRef ref) {
final value = ref.watch(valueStateProvider);
ref.listen<int>(valueStateProvider, (prev, curr) {
if (curr == 65) {
// show a dialog
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Value is 65')),
);
}
});
...
但它与下面的一个有什么不同,因为ref
在这里被观看?
Widget build(BuildContext context, WidgetRef ref) {
final value = ref.watch(valueStateProvider);
if (value == 65) {
// show a dialog
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Value is 65')),
);
}
...
既然使用了watch
,那么value
不应该自动更新吗?那么为什么这里使用watch
而不是read
呢?
2条答案
按热度按时间nimxete21#
此代码有以下bug:每当Widget被重建时(这可能在任何时候发生,Flutter有时只是为了好玩而做),并且您的
value
是65,就会显示snackbar。因此,在最坏的情况下,每帧显示一个新的零食条。ref.watch(valueStateProvider)
将在每次 valueStateProvider 更改时重建Widget。ref.listen(valueStateProvider)
将在每次 valueStateProvider 更改时运行提供的回调。所以在你的例子中,你想使用
ref.listen
!qnyhuwrf2#
监听(
ref.listen
)不会触发小部件的重建,而ref.watch
将在发生更改时触发build
方法。