首页 > 解决方案 > 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

标签: flutterdartflutter-bloc

解决方案


所以我相信我发现了问题:

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>>。


推荐阅读