【发布时间】:2021-08-06 09:49:03
【问题描述】:
我正在尝试使用以下通用 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));
我得到错误:
抛出了另一个异常:错误:找不到正确的 Provider
在此之上 ContributionSelectorPage 小部件
如果我也尝试跳过上述内容并使用 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);
},
);
}
}
是不是不支持泛型bloc?
我正在使用flutter_bloc:^7.0.0
【问题讨论】:
-
您能显示您调用的位置或您尝试调用该块的构建上下文吗?这可能是因为您使用了不正确的上下文(上下文不在树的块下)来读取块
-
我在 BlocProvider 之后直接调用它。
-
> 我在 BlocProvider 之后调用它。这就是问题所在,正如@CbL 所提到的——使用了错误的上下文。可能您需要使用 BlocProvider 下的 Builder() 来创建另一个上下文并能够访问 BLoC。请提供您尝试访问 BLoC 的确切位置的代码。
-
我已经包含了相关代码。因此,如果我尝试使用 BlocBuilder 导航到另一个屏幕,我仍然会遇到同样的问题。这让我认为由于某种原因不支持通用 BloC。是这样吗?
-
只是想确认 ManageFeedbackPage 是否是 BlocProvider
> 的子项?因为我只能看到消费者部分。
标签: flutter dart flutter-bloc