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对应一个)
  • 合并两个bloc并仅使用一个
    BlocBuilder
  • 如果您选择第一个选项是因为希望有两个分离的bloc,请执行类似操作(注意,不同bloc的状态变量名称不同,以避免仅使用内部
    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