【问题标题】:BlocProvider not finding Generic Flutter BlocBlocProvider 未找到通用颤振 Bloc
【发布时间】: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


【解决方案1】:

所以我相信我找到了问题:

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 而不是 BlocProvider>。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-24
    • 2020-08-25
    • 2020-03-11
    • 1970-01-01
    • 2022-10-01
    • 2020-10-14
    • 2019-06-04
    • 2018-11-12
    相关资源
    最近更新 更多