我正在尝试创建一个通用函数来将屏幕构建器与块列表的提供程序包装在一起。这是我目前所拥有的:
class AppRouter {
final _cartCubit = CartCubit();
Route onGenerateRoute(RouteSettings settings) {
MaterialPageRoute generateRoute(builder, {List blocs}) {
return MaterialPageRoute(
settings: settings,
builder: (blocs ?? []).fold(
builder,
(previousValue, bloc) {
if (bloc is Cubit<Object>)
return (_) => BlocProvider.value(
value: bloc,
child: Builder(builder: previousValue),
);
else
return previousValue;
},
),
);
}
switch (settings.name) {
case '/':
return generateRoute((_) => Home(), blocs: [_cartCubit]);
break;
... }}
当我运行代码时,我的应用程序中的 BlocBuilders 和 Listeners 找不到 Cubit,所以我收到错误:Error: Could not find the correct Provider<CartCubit> above this BlocBuilder<CartCubit, CartState> Widget
。如果我像这样将值传递给 BlocProvider.value 铸造 bloc:value: bloc as CartCubit
,它工作得很好。如果我用 _cartCubit 变量替换“bloc”变量,它也能完美运行,即使是“bloc == _cartCubit”也被评估为“true”。所以我假设当我的 Cubits 列表作为参数传递时,CartCubit 失去了它的类型,所以它不能被 Builders 发现。即使我给作为参数传递给 generateRoute 的 List 块提供一个类型,例如 List<Cubit> blocs
,也会发生这种情况。
但是当我调试时,我可以将鼠标悬停在 bloc 变量上,它会显示正确的类型“CartCubit”。为什么会这样?如果 bloc 变量已经具有“CartCubit”类型,为什么我需要转换它?有什么办法可以避免它,因为我希望能够提供不同的Cubits作为generateRoute的参数?为什么我不能做类似 List 的事情,或者我怎样才能让变量在传递给 List 时不丢失它的类型?
提前致谢。