如何在 Flutter 中从另一个屏幕监听 BLoC 事件
How To Listen to BLoC Events From Another Screen in Flutter
已解决:我得到的是另一个状态,而不是我预期的状态
我的应用程序中有两个屏幕。第一个包含产品,每个产品都用 CheckboxListTile
包裹,复选框值是一个变量,它的值是通过检查产品 ID 是否存在于名为 selectedItemsList
的列表中指定的,现在是第二个screen 是一个购物车屏幕,其中包含来自第一个屏幕的 selected 产品,每个 cartItem
都包裹在 Dismissible
中,onDismissed
函数将产品从购物车中移除,并且从 selectedItemsList
列表中删除它的 ID。
我想要的是在我按下后退按钮并从购物车屏幕导航回产品屏幕时更改从购物车中删除的复选框值。
我的目标更详细的解释:
- 产品屏幕有 2 个产品(p1 和 p2)。
- I select p1 并将其添加到购物车并将其 ID 添加到
selectedItemsList
。
- p1 复选框的值为真(选中)。
- 我导航到购物车屏幕,然后从那里删除 p1。
- p1 现在已从购物车中删除,它的 ID 已从
selectedItemsList
中删除。
- 我按下后退按钮并导航回产品屏幕。
- p1 复选框值应该是 false(未选中),因为它的 id 不在
selectedItemsList
中,但它仍然是 true(已选中)。
- 当我在购物车屏幕中从购物车中删除产品时,我想更新(或实际重建)产品屏幕。
我正在使用 bloc
模式实现上述内容。我正在从 CartBloc
:
触发一个名为 RemoveItemFromCart
的事件
void _onDismissed({
required BuildContext context,
required int index,
}) {
BlocProvider.of<CartBloc>(context).add(
RemoveItemFromCart(
items: _cartItems,
index: index,
counts: _counts,
filteredCounts: _filteredCounts,
originalIndices: _originalIndices,
filteredItems: _filteredCartItems,
filtering: _filtering,
),
);
_firstTime = true;
}
然后产生一个名为ItemRemovedFromCart
的状态:
if (event is RemoveItemFromCart) {
if (event.filtering &&
event.originalIndices.isNotEmpty &&
event.filteredCounts.isNotEmpty &&
event.filteredItems.isNotEmpty) {
int itemIndex = event.items.indexWhere(
(item) => item.id == event.filteredItems[event.index].id,
);
productsRepository.unSelectProduct(
id: event.items[itemIndex].id,
);
event.items.removeAt(itemIndex);
event.counts.removeAt(itemIndex);
event.filteredItems.removeAt(event.index);
event.filteredCounts.removeAt(event.index);
event.originalIndices.removeAt(event.index);
} else {
productsRepository.unSelectProduct(
id: event.items[event.index].id,
);
event.items.removeAt(event.index);
event.counts.removeAt(event.index);
}
yield ItemRemovedFromCart(
items: event.items,
counts: event.counts,
filteredCounts: event.filteredCounts,
filteredItems: event.filteredItems,
originalIndices: event.originalIndices,
);
}
在产品屏幕中,我正在使用 BlocBuilder
在产生此状态时进行重建(但现在我只是尝试打印测试字符串以查看它是否正常工作):
BlocBuilder<CartBloc, CartState>(
builder: (context, state) {
if (state is ItemRemovedFromCart) print('asd');
return _buildProductsList(products, context);
},
)
打印语句没有执行,如何监听另一个屏幕的事件?
提前致谢。
我发现 bloc 实例会一直监听事件,只要它们没有关闭或处置,所以如果我们想对来自另一个屏幕的事件采取行动,我们只需向所需的 bloc 添加一个事件即可
已解决:我得到的是另一个状态,而不是我预期的状态
我的应用程序中有两个屏幕。第一个包含产品,每个产品都用 CheckboxListTile
包裹,复选框值是一个变量,它的值是通过检查产品 ID 是否存在于名为 selectedItemsList
的列表中指定的,现在是第二个screen 是一个购物车屏幕,其中包含来自第一个屏幕的 selected 产品,每个 cartItem
都包裹在 Dismissible
中,onDismissed
函数将产品从购物车中移除,并且从 selectedItemsList
列表中删除它的 ID。
我想要的是在我按下后退按钮并从购物车屏幕导航回产品屏幕时更改从购物车中删除的复选框值。
我的目标更详细的解释:
- 产品屏幕有 2 个产品(p1 和 p2)。
- I select p1 并将其添加到购物车并将其 ID 添加到
selectedItemsList
。 - p1 复选框的值为真(选中)。
- 我导航到购物车屏幕,然后从那里删除 p1。
- p1 现在已从购物车中删除,它的 ID 已从
selectedItemsList
中删除。 - 我按下后退按钮并导航回产品屏幕。
- p1 复选框值应该是 false(未选中),因为它的 id 不在
selectedItemsList
中,但它仍然是 true(已选中)。 - 当我在购物车屏幕中从购物车中删除产品时,我想更新(或实际重建)产品屏幕。
我正在使用 bloc
模式实现上述内容。我正在从 CartBloc
:
RemoveItemFromCart
的事件
void _onDismissed({
required BuildContext context,
required int index,
}) {
BlocProvider.of<CartBloc>(context).add(
RemoveItemFromCart(
items: _cartItems,
index: index,
counts: _counts,
filteredCounts: _filteredCounts,
originalIndices: _originalIndices,
filteredItems: _filteredCartItems,
filtering: _filtering,
),
);
_firstTime = true;
}
然后产生一个名为ItemRemovedFromCart
的状态:
if (event is RemoveItemFromCart) {
if (event.filtering &&
event.originalIndices.isNotEmpty &&
event.filteredCounts.isNotEmpty &&
event.filteredItems.isNotEmpty) {
int itemIndex = event.items.indexWhere(
(item) => item.id == event.filteredItems[event.index].id,
);
productsRepository.unSelectProduct(
id: event.items[itemIndex].id,
);
event.items.removeAt(itemIndex);
event.counts.removeAt(itemIndex);
event.filteredItems.removeAt(event.index);
event.filteredCounts.removeAt(event.index);
event.originalIndices.removeAt(event.index);
} else {
productsRepository.unSelectProduct(
id: event.items[event.index].id,
);
event.items.removeAt(event.index);
event.counts.removeAt(event.index);
}
yield ItemRemovedFromCart(
items: event.items,
counts: event.counts,
filteredCounts: event.filteredCounts,
filteredItems: event.filteredItems,
originalIndices: event.originalIndices,
);
}
在产品屏幕中,我正在使用 BlocBuilder
在产生此状态时进行重建(但现在我只是尝试打印测试字符串以查看它是否正常工作):
BlocBuilder<CartBloc, CartState>(
builder: (context, state) {
if (state is ItemRemovedFromCart) print('asd');
return _buildProductsList(products, context);
},
)
打印语句没有执行,如何监听另一个屏幕的事件?
提前致谢。
我发现 bloc 实例会一直监听事件,只要它们没有关闭或处置,所以如果我们想对来自另一个屏幕的事件采取行动,我们只需向所需的 bloc 添加一个事件即可