dart Riverpod 2 -使用AsyncNotifierProvider进行过滤,select

c8ib6hqw  于 2023-09-28  发布在  其他
关注(0)|答案(1)|浏览(87)

假设我有Riverpod 2的AsyncNotifierProvider

final asyncOnlineUsersProvider =
    AsyncNotifierProvider.autoDispose<AsyncUserListNotifier, List<User>>(() {
  return AsyncUserListNotifier();
});

我想呈现一个只显示用户数量的小部件,并且我想优化它,以便只有当数量发生变化时才能再次呈现。我选择.select如下:

final listSize = ref.watch(
  asyncOnlineUsersProvider.select((data) => AsyncValue.data(data.value?.length)),
);

然后我们渲染小部件

listSize.when(
  data: (data) => Text('Size:$data'),
  error: (err, stack) => const Text('error'),
  loading: () => const Text('loading'),
);

这种方法的问题是,加载并没有被调用,而是在获取数据时显示Size:null,然后显示实际大小:Size:12
有没有一种方法可以实现这一点,这样我就可以使用.select来呈现小部件,只有当列表的大小改变时,还可以在获取数据时显示加载?

vsnjm48y

vsnjm48y1#

也许这个方法对你有用:

// ListWidget
asyncOnlineUsersProvider.when(
  data: (_) => const DataWidget(),
  error: (err, stack) => const Text('error'),
  loading: () => const Text('loading'),
);

// DataWidget
final listSize = ref.watch(
  asyncOnlineUsersProvider.select((data) => AsyncData(data.value?.length)),
);

listSize.maybeWhen(
  data: (data) => data.isEmpty ? Text('List empty') : Text('Size:$data'),
  orElse: () => const SizedBox.shrink(),
);

orElse块永远不会显示。

相关问题