flutter 听一个国家的提供者和看它有什么不同?

bvjxkvbb  于 2023-05-08  发布在  Flutter
关注(0)|答案(2)|浏览(126)

有一个国家提供商

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呢?

nimxete2

nimxete21#

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')),
      );
  }

此代码有以下bug:每当Widget被重建时(这可能在任何时候发生,Flutter有时只是为了好玩而做),并且您的value是65,就会显示snackbar。因此,在最坏的情况下,每帧显示一个新的零食条。
ref.watch(valueStateProvider)将在每次 valueStateProvider 更改时重建Widget。
ref.listen(valueStateProvider)将在每次 valueStateProvider 更改时运行提供的回调。
所以在你的例子中,你想使用ref.listen

qnyhuwrf

qnyhuwrf2#

监听(ref.listen)不会触发小部件的重建,而ref.watch将在发生更改时触发build方法。

相关问题