flutter - BlocProvider 未找到通用颤振 Bloc
问题描述
我有以下我正在尝试使用的通用 Bloc。
class ManageFeedbackBloc<T extends IContribute>
extends Bloc<ManageFeedbackEvent, ManageFeedbackState> {}
我使用以下提供程序来创建它:
void _navigateToContributionPage(
BuildContext context, FeedbackCategory category) {
final userFeedbackBloc = BlocProvider.of<UserFeedbacksBloc>(context);
final manageFeedbackBloc = ManageFeedbackBloc<DoctorFeedback>(
repository: ManageFeedbackRepository());
final manageFeedbackDestination =
BlocProvider<ManageFeedbackBloc<DoctorFeedback>>(
create: (context) => manageFeedbackBloc,
child: ManageFeedbackPage<DoctorFeedback>(),
lazy: false,
);
userFeedbackBloc.monitorFeedbackChanges(
BlocProvider.of<ManageFeedbackBloc<DoctorFeedback>>(context));
Navigator.of(context).pushReplacement(
MaterialPageRoute(builder: (context) => manageFeedbackDestination));
}
上面的代码在这一行崩溃:
userFeedbackBloc.monitorFeedbackChanges(
BlocProvider.of<ManageFeedbackBloc<DoctorFeedback>>(context));
我得到错误:
引发了另一个异常:错误:在此 ContributionSelectorPage 小部件上方找不到正确的 Provider<ManageFeedbackBloc>
如果我也尝试跳过上述内容并使用 BlocBuilder,我会得到同样的错误。请看下面的代码:
class ManageFeedbackPage<T extends IContribute> extends StatelessWidget {
final _formKey = GlobalKey<FormState>();
@override
Widget build(BuildContext context) {
return BlocConsumer<ManageFeedbackBloc<T>, ManageFeedbackState>(
listenWhen: (_, currentState) => currentState.isListenerState,
buildWhen: (_, currentState) => !currentState.isListenerState,
listener: (context, state) async {
if (state is ManageFeedbackPromptUpdate) {
_promptActionAlert(
context,
'Modification',
'Êtes vous sûr de vouloir modifier ce retour d\'expérience ?',
ManageFeedbackUpdateFeedback());
return;
}
throw UnimplementedError(
'manage_feedback_page - UnImplemented State: Tried to implement listening state to ${state.toString()}');
},
builder: (context, state) {
if (state is ManageFeedbackLoading) {
return _getLoadingState();
}
return _getLoadedState(context);
},
);
}
}
是不是不支持通用集团?
我正在使用flutter_bloc:^7.0.0
解决方案
所以我相信我发现了问题:
final manageFeedbackDestination =
BlocProvider<ManageFeedbackBloc<DoctorFeedback>>(
create: (context) => manageFeedbackBloc,
child: ManageFeedbackPage<DoctorFeedback>(),
lazy: false,
);
BlocProvider 类型不应该指定泛型类型,只指定没有泛型的 BloC 类型。
final manageFeedbackDestination =
BlocProvider<ManageFeedbackBloc>(
create: (context) => manageFeedbackBloc,
child: ManageFeedbackPage<DoctorFeedback>(),
lazy: false,
);
这对我有用 BlocProvider<ManageFeedbackBloc> 而不是 BlocProvider<ManageFeedbackBloc<DoctorFeedback>>。
推荐阅读
- java - 使用 Java DSL 返回给调用者方法的响应为空
- c# - 具有授权的 Web API 不断提示登录
- elasticsearch - spring data elasticsearch中,聚合查询可以放在repository实现吗?
- c# - EMP id 字符串之间带有星号的掩码
- django - 使用参数重定向 django 3.0
- json - 结构中的golang解组(反序列化)变量类型字典
- javascript - 创建侧边栏导航菜单
- r - R - 在 Jupyter 中创建带有 21+ 列的空 data.frame 时发出警告
- if-statement - 休息时间计算器
- java - 存储为超类时取回子类