根据参数更改 BlocBuilder 的 bloc

Changing the bloc of a BlocBuilder depending on a parameter

我有一个 BlocBuilder,它允许我构建一个元素列表。所考虑的 BlocBuilder Bloc 在其状态下有 List<T> 个要显示的元素。

现在我想使用相同的 BlocBuilder,但使用不同的 Bloc 为其提供不同的数据源(另一个 Bloc 也将在其状态下保存 List<T>)。这个新小部件将以与另一个小部件完全相同的方式显示信息,唯一改变的是内容和数据。

问题是我不想 copy/paste 我的整个 BlocBuilder 只是因为 Bloc 不同。我唯一需要更改的是,它必须是 BlocBuilder<BlocB, BlocBState> 而不是 BlocBuilder<BlocA, BlocAState>,为此,我认为 copy/pasting 整个文件不值得。

我想知道是否可以仅使用三元运算符更改 Bloc 的类型。像

bool isTypeA;

BlocBuilder<isTypeA ? BlocA, BlocAState : BlocB, BlocBState>

如果我在 BlocBuilder 之前检查,我将不得不 copy/paste 我试图避免的全部内容。

bool isTypeA;

isTypeA ? return BlocBuilder< BlocA, BlocAState>(...) : return BlocBuilder< BlocB, BlocBState>(...) 

首先,创建一个方法(甚至可以是构建函数中的本地方法)到 return 来自您的项目的小部件,无论它们来自哪里:

Widget buildFromItems(List<ItemType> items) {
    return // something that creates a view of your items, maybe a ListView
}

然后在你的构建函数中:

return isTypeA 
    ?  BlocBuilder<BlocA, BlocAState>(builder:
          (context, Astate) => buildFromItems(Astate.ItemList))
    :  BlocBuilder<BlocB, BlocBState>(builder:
          (context, Bstate) => buildFromItems(Bstate.ItemList));