Flutter 列表中对象的更改不会刷新子组件
我有下面的颤振代码。由于以下代码中的某些原因,Flutter 列表中对象的更改不会刷新子组件,flutter,flutter-layout,Flutter,Flutter Layout,我有下面的颤振代码。由于以下代码中的某些原因,\u cartProducts[index].quantity=state.quantity已正确分配,但未更新ProductListItem。有什么想法吗 class HomePage extends StatefulWidget { @override _HomePageState createState() => _HomePageState(); } class _HomePageState extends State<
\u cartProducts[index].quantity=state.quantity
已正确分配,但未更新ProductListItem
。有什么想法吗
class HomePage extends StatefulWidget {
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
CartBloc cartBloc;
TrendingProductBloc trendingProductBloc;
List<CartEntry> _cartProducts = [];
List<Product> trendingProducts;
@override
void initState() {
super.initState();
cartBloc = BlocProvider.of<CartBloc>(context);
trendingProductBloc = BlocProvider.of<TrendingProductBloc>(context);
cartBloc.add(GetCartProductsEvent()); // load cart items
trendingProductBloc.add(LoadTrendingProductsEvent()); // load trending items
cartBloc.stream.listen((state) {
if (state is GetCartProductsCompletedState) { //triggered when load cart entries
_cartProducts = state.cartProductsList;
}
if (state is UpdateQuantityCompletedState) { //triggered when update quantity of an cart item
int index = _cartProducts.indexWhere((item) => item.product.id == state.productId);
_cartProducts[index].quantity = state.quantity; // This has no effect
}
});
}
@override
Widget build(BuildContext context) {
super.build(context);
.....
Container(
height: 280.0,
child: BlocBuilder(
bloc: trendingProductBloc,
builder: (context, state) {
if (state is LoadTrendingProductsCompletedState) {
trendingProducts = state.productList;
return ListView.separated(
itemBuilder: (context, index) {
return ProductListItem( // This has no effect when a list item quantity changes.
cartProducts: _cartProducts,
product: trendingProducts[index],
cartBloc: cartBloc,
currentUser: currentUser,
);
},
)
}
},
),
),
}
}
类主页扩展StatefulWidget{
@凌驾
_HomePageState createState()=>\u HomePageState();
}
类_HomePageState扩展状态{
CartBloc CartBloc;
TrendingProductBloc TrendingProductBloc;
列表_cartProducts=[];
列出趋势产品;
@凌驾
void initState(){
super.initState();
cartBloc=BlocProvider.of(上下文);
trendingProductBloc=BlocProvider.of(上下文);
添加(GetCartProductsEvent());//加载购物车项目
trendingProductBloc.add(LoadTrendingProductsEvent());//加载趋势项
cartBloc.stream.listen((状态){
如果(状态为GetCartProductsCompletedState){//在加载购物车条目时触发
_cartProducts=state.cartProductsList;
}
如果(状态为UpdateQuantityCompletedState){//在更新购物车项目数量时触发
int index=\u cartProducts.indexWhere((项)=>item.product.id==state.productId);
_cartProducts[index].quantity=state.quantity;//这不起作用
}
});
}
@凌驾
小部件构建(构建上下文){
super.build(上下文);
.....
容器(
身高:280.0,
孩子:BlocBuilder(
集团:趋势产品集团,
生成器:(上下文、状态){
if(状态为LoadTrendingProductsCompletedState){
trendingProducts=state.productList;
返回ListView.separated(
itemBuilder:(上下文,索引){
return ProductListItem(//当列表项数量更改时,此选项无效。
cartProducts:_cartProducts,
产品:趋势产品[指数],
cartBloc:cartBloc,
currentUser:currentUser,
);
},
)
}
},
),
),
}
}
仅当启动状态LoadTrendingProductsCompletedState
时,才更新ProductListItem
。因此,如果您想在购物车中的商品数量发生变化时更新ProductListItem
,您还需要监听UpdateQuantityCompletedState
状态。但是请记住,向BlocBuilder
提供trendingProductBloc
bloc,而UpdateQuantityCompletedState
属于cartBloc
bloc,这是一个不同的bloc。因此,您有两种选择:
BlocBuilders
(每个bloc对应一个)BlocBuilder
BlocBuilder的状态)
。。。
@凌驾
小部件构建(构建上下文){
super.build(上下文);
.....
容器(
身高:280.0,
孩子:BlocBuilder(
集团:cartBloc,
生成器:(上下文,cartState){
返回BlocBuilder(
集团:趋势产品集团,
生成器:(上下文,趋势产品状态){
/这里你考虑来自不同集团的国家。
如果(cartState为UpdateQuantityCompletedState | | trendingProductState为LoadTrendingProductsCompletedState){
trendingProducts=state.productList;
返回ListView.separated(
itemBuilder:(上下文,索引){
返回ProductListItem(
cartProducts:_cartProducts,
产品:趋势产品[指数],
cartBloc:cartBloc,
currentUser:currentUser,
);
},
)
}
},
);
},
),
),
}
…
我不知道您的bloc是如何工作的,但我认为您需要通过添加更新新状态的事件来更新屏幕。最简单的方法是在更改数量后添加setState
。