Flutter List.add与手动将项目添加到Riverpod StateNotifier之间的差异<;列表<;字符串>&燃气轮机;

Flutter List.add与手动将项目添加到Riverpod StateNotifier之间的差异<;列表<;字符串>&燃气轮机;,flutter,dart,state,riverpod,Flutter,Dart,State,Riverpod,我想学习如何使用,因此为此,我正在实现一个小应用程序,它显示一个项目列表和一个按钮,当点击该按钮时,会将一个虚拟项目添加到列表中 问题背景 按下以下应用程序中的按钮可按预期工作(添加了一个虚拟项,更改将立即反映在UI中): 导入“包装:颤振/材料.省道”; 进口“包装:颤振_riverpod/颤振_riverpod.dart”; void main()=>runApp(const ProviderScope(子项:MyApp()); 类MyApp扩展了无状态小部件{ constmyapp({Ke

我想学习如何使用,因此为此,我正在实现一个小应用程序,它显示一个项目列表和一个按钮,当点击该按钮时,会将一个虚拟项目添加到列表中

问题背景 按下以下应用程序中的按钮可按预期工作(添加了一个虚拟项,更改将立即反映在UI中):

导入“包装:颤振/材料.省道”;
进口“包装:颤振_riverpod/颤振_riverpod.dart”;
void main()=>runApp(const ProviderScope(子项:MyApp());
类MyApp扩展了无状态小部件{
constmyapp({Key}):超级(Key:Key);
@凌驾
小部件构建(BuildContext上下文)=>MaterialApp(主页:HomePage());
}
final itemsProvider=StateNotifierProvider((ref)=>ItemsList());
类ItemsList扩展了StateNotifier{
项目列表([列表项目]):超级(项目??[]);
void add(字符串项)=>state=[…state,item];
}
类主页扩展了ConsumerWidget{
const主页({Key}):超级(Key:Key);
@凌驾
小部件构建(BuildContext上下文,ScopeDrawer监视){
最终项目=观察(itemsProvider.state);
返回脚手架(
正文:专栏(
mainAxisAlignment:mainAxisAlignment.center,
子项:items.map((e)=>Text(e)).toList(),
),
浮动操作按钮:浮动操作按钮(
onPressed:()=>context.read(itemsProvider).add('Other item'),
工具提示:“添加项目”,
子:图标(Icons.add),
),
);
}
}
问题 在
ItemsList
类的
add
方法中,我认为将语句
state=[…state,item]
更改为
state.add(item)
不会有任何区别。但是,这样做会使应用程序不再响应状态更改:点击按钮不会触发对UI的更改,并且在热重新加载应用程序之前,我不会在UI中看到任何新项目

所以要明确的是:更改
voidadd(stringitem)=>state=[…state,item]
to
void add(字符串项)=>state.add(项)断开应用程序状态和UI之间的链接


为什么手动添加具有列表解构功能的项目不同于使用
list.add
?非常感谢您。

状态必须以
oldValue==newValue
为false的方式更改。默认情况下,使用
.add
将元素添加到列表中会使列表在适当的位置发生变化,因此保持相等。这就是为什么所有的例子都有类似于
state=[…state,foo]
的东西,所以一个全新的列表处于状态,而这并不等于旧的列表