问题描述
我已经使用 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 状态的数组修改。