首页 > 解决方案 > flutter_bloc 找不到正确的提供程序

问题描述

我有一个从 API 获取数据的 Cubit。我想将它连接到 UI,所以我BlocProvider首先在那个小部件的顶部添加了一个。这给了我一个错误,所以我用MaterialAppBlocProvider 包装了同样的错误。之后,我尝试将它放在我想要访问它的路线周围,结果相同。

MaterialApp(
      debugShowCheckedModeBanner: false,
      theme: getThemeData(),
      onGenerateRoute: _router.generateRoutes,
      initialRoute: _store.get('users', defaultValue: {}).isEmpty
          ? '/onboarding'
          : '/dashboard',
);

路线.dart

final PANCubit _panCubit = PANCubit(PANRepository());
  Route<dynamic> generateRoutes(RouteSettings settings) {
    switch (settings.name) {
      // case '/':
      //   return MaterialPageRoute(builder: (context) => Home());
      case '/':
      case '/onboarding':
        return MaterialPageRoute(
          builder: (context) => BlocProvider.value(
            value: _panCubit,
            child: OnBoarding(),
          ),
        );
...

我想在这里的 UI 中访问它:

OnBoardingView(
  imagePath: process_svg,
  titleWidget: BlocBuilder(
    builder: (context, state) {
      context.read<PANCubit>().getPANInformation(_panText.text);

      if (state is PANLoading) {
        return CircularProgressIndicator();
      } else if (state is PANFetched) {
        return Text(
          'Hey ${state.panInformation.fullName}!',
          style: Theme.of(context).textTheme.headline1,
        );
      } else {
        return Text('Hmmm..Something went wrong.');
      }
    },
  ),
...

标签: flutterblocflutter-bloc

解决方案


您需要确定要访问的区域BlocBuilder

titleWidget: BlocBuilder<PANCubit, PANState>( // Replace PANState by the type of state
    builder: (context, state) {
      state.getPANInformation(_panText.text);

      if (state is PANLoading) {
        return CircularProgressIndicator();
      } else if (state is PANFetched) {
        return Text(
          'Hey ${state.panInformation.fullName}!',
          style: Theme.of(context).textTheme.headline1,
        );
      } else {
        return Text('Hmmm..Something went wrong.');
      }
    },
  ),

推荐阅读