带钩子的 Riverpod 不会重建 ListView

问题描述

我已经使用 hooks_riverpod 实现了一个简单的 ListView。有一个按钮可以向 ListView 添加新项目 (Other Store),但是当我单击它时,ListView 不会改变。我知道该项目已添加到列表中,因为我通过打印检查了 storeList 的值。任何想法为什么 ListView.separated 在列表更改时不重建?

套餐:
Flutter_hooks: 0.17.0
hooks_riverpod:0.14.0
state_notifier: 0.7.0

class StoreListController extends StateNotifier<List<String>> {
  StoreListController() : super(['First Store']);
  void add() => state.add('Other Store');
}
final storeListProvider =
    StateNotifierProvider<StoreListController,List<String>>(
  (_) => StoreListController(),);

class HomePage extends HookWidget {
  @override
  Widget build(BuildContext context) {
    final storeList = useProvider(storeListProvider);
    return Scaffold(
      appBar: AppBar(
        title: Text('ListView Sample'),),body: ListView.separated(
        itemBuilder: (context,index) => ListTile(
          title: Text(storeList[index]),itemCount: storeList.length,separatorBuilder: (context,index) => const Divider(),floatingActionButton: FloatingActionButton(
        onpressed: () => context.read(storeListProvider.notifier).add(),child: Icon(Icons.add),);
  }
}

解决方法

问题在于您如何修改 StateNotifier 中的状态。

要更新状态,您必须实际替换状态对象。

将您的添加功能更改为以下内容:

void add() => state = [...state,'Other Store'];

Here's an example 来自 Riverpod 的开发者,展示了作为 StateNotifier 状态的数组修改。