在应用程序中我使用的是 Cubit。ItemData 从 firestore 获取。一切正常,但在列表中添加项目并更新 firestore 中的值(名称)后,列表中仍然是旧值。怎么解决呢?
class TestPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
children: [
BlocBuilder<ItemCubit, ItemState>(
cubit: ItemCubit(DataBase())..getItemData(item),
builder: (context, state) {
if (state is ItemData) {
return Column(
children: [
Text(state.item.name),
RaisedButton(
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => TestPage1(
item: state.item,
)));
},
child: Text('showPage'),
),
RaisedButton(
onPressed: () {
context.bloc<TestCubit>().add(item);
},
)
],
);
}
return Container(
child: Text('error'),
);
},
)
],
),
);
}
}
Run Code Online (Sandbox Code Playgroud)
为了在列表中添加项目,我使用另一个肘节代码:
class AddCubit extends Cubit<AddState> {
AddCubit() : super(AddInitial());
List<Item> items = List<Item>();
void addItem(Item item) {
items.add(item);
emit(LoadList(items));
}
}
Run Code Online (Sandbox Code Playgroud)
这是用于检索 TestPage1 中的项目列表的块:
BlocBuilder<AddCubit, AddState>(builder: (context, state) {
if (state is LoadList) {
return Column(
children: state.items.toSet().map((item) {
return Card(
child: Text(item.name),
);
}).toList(),
);
}
})
Run Code Online (Sandbox Code Playgroud)
州代码:
class LoadList extends AddState {
final List<Item> items;
LoadList(this.items);
}
Run Code Online (Sandbox Code Playgroud)
在 flutter 中,当你比较同一类的两个对象时,即使它们的值不同,你也总是相等的。除非您将在班级中使用相等方法。
具有相等方法的类代码
import 'package:equatable/equatable.dart';
class LoadList extends AddState {
final List<Item> items;
LoadList(this.items);
@override
List<Object> get props => [items];
}
Run Code Online (Sandbox Code Playgroud)
第二件事是您应该使用复制而不是为新值创建新状态。稍后它会派上用场,并减少以后可能出现的错误数量。
状态类的完整代码
import 'package:equatable/equatable.dart';
class LoadList extends AddState {
final List<Item> items;
LoadList(this.items);
LoadList copyWith({
List<Item> items,
}) {
return LoadList(
items: items?? this.items,
);
}
@override
List<Object> get props => [items];
}
Run Code Online (Sandbox Code Playgroud)
然后对于您的 void 函数,您应该使用:
void addItem(Item item) {
items.add(item);
emit(state.copyWith(items: items);
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
6730 次 |
最近记录: |