Flutter 使用不包含类型为的Bloc的上下文调用的Flatter BlocProvider.of()

Flutter 使用不包含类型为的Bloc的上下文调用的Flatter BlocProvider.of(),flutter,bloc,Flutter,Bloc,我正在从第一个屏幕导航到第二个屏幕。我在第二个屏幕中使用了Bloc模式。我得到以下错误: BlocProvider.of() called with a context that does not contain a Bloc of type No ancestor could be found starting from the context that was passed to BlocProvider.of<MyBloc>(). This can happ

我正在从第一个屏幕导航到第二个屏幕。我在第二个屏幕中使用了Bloc模式。我得到以下错误:

 BlocProvider.of() called with a context that does not contain a Bloc of type 
   No ancestor could be found starting from the context that was passed to BlocProvider.of<MyBloc>().

    This can happen if:
    1. The context you used comes from a widget above the BlocProvider.
    2. You used MultiBlocProvider and didn't explicity provide the BlocProvider types.
BlocProvider.of()使用不包含类型为的Bloc的上下文调用
从传递给BlocProvider.of()的上下文开始找不到祖先。
如果:
1.您使用的上下文来自BlocProvider上方的小部件。
2.您使用了MultiBlocProvider,但没有明确提供BlocProvider类型。
下面是我的导航代码

 BlocProvider<MyBloc>(
            create: (context) => MyBloc());
        Navigator.push(context, MaterialPageRoute(builder: (context) {
          
          return SecondScreen(context);
        }));
BlocProvider(
create:(context)=>MyBloc());
Navigator.push(上下文,MaterialPage路由(生成器:(上下文){
返回第二屏幕(上下文);
}));
下面是我的第二个屏幕课程

  class SecondScreen extends StatefulWidget {
  @override
  _SecondScreenState createState() => _SecondScreenState();
   }

class _SecondScreenState extends State<SecondScreen> {
  MyBloc myBloc;

  @override
  void initState() {
    super.initState();
    myBloc = BlocProvider.of<MyBloc>(context);
    myBloc.add(FetchEvents());
 }

  @override
  Widget build(BuildContext context) {
  return MaterialApp(
  home: Builder(
    builder: (context) {
      return Material(
        child: Scaffold(
          appBar: AppBar(
            title: Text("New Screen"),
            actions: <Widget>[
              IconButton(
                icon: Icon(Icons.refresh),
                onPressed: () {
                  myBloc.add(FetchEvents());
                },
              ),
              IconButton(
                icon: Icon(Icons.info),
                onPressed: () {
                },
              )
            ],
          ),
          body: Container(
            child: BlocListener<MyBloc, MyState>(
              listener: (context, state) {
                if (state is MyErrorState) {
                  Scaffold.of(context).showSnackBar(
                    SnackBar(
                      content: Text(state.message),
                    ),
                  );
                }
              },
              child: BlocBuilder<MyBloc, MyState>(
                builder: (context, state) {
                  if (state is MyInitialState) {
                    return buildLoading();
                  } else if (state is MyLoadingState) {
                    return buildLoading();
                  } else if (state is MyLoadedState) {
                    return buildArticleList(state.yList);
                  } else if (state is MyErrorState) {
                    return buildErrorUi(state.message);
                  }
                },
              ),
            ),
          ),
        ),
      );
    },
  ),
  );
   }

 Widget buildLoading() {
  return Center(
  child: CircularProgressIndicator(),
   );
 }

  Widget buildErrorUi(String message) {
 return Center(
  child: Padding(
    padding: const EdgeInsets.all(8.0),
    child: Text(
      message,
      style: TextStyle(color: Colors.red),
    ),
  ),
  );
 }

  Widget buildArticleList(List<Data> data) {
  return ListView.builder(
  itemCount: data.length,
  itemBuilder: (ctx, pos) {
    return Padding(
      padding: const EdgeInsets.all(8.0),
      child: InkWell(
        child: ListTile(
         
          title: Text(data[pos].title),
          subtitle: Text(data[pos].shortDesc),
        ),
        onTap: () {
          // navigateToArticleDetailPage(context, articles[pos]);
        },
      ),
    );
  },
  );
  }
 }
class SecondScreen扩展StatefulWidget{
@凌驾
_SecondScreenState createState()=>\u SecondScreenState();
}
类_SecondScreenState扩展状态{
MyBloc MyBloc;
@凌驾
void initState(){
super.initState();
myBloc=BlocProvider.of(上下文);
添加(FetchEvents());
}
@凌驾
小部件构建(构建上下文){
返回材料PP(
住家:建筑商(
生成器:(上下文){
退货(
孩子:脚手架(
appBar:appBar(
标题:文本(“新屏幕”),
行动:[
图标按钮(
图标:图标(Icons.refresh),
已按下:(){
添加(FetchEvents());
},
),
图标按钮(
图标:图标(Icons.info),
已按下:(){
},
)
],
),
主体:容器(
孩子:布洛克斯腾纳(
侦听器:(上下文、状态){
如果(状态为MyErrorState){
Scaffold.of(上下文).showSnackBar(
小吃条(
内容:文本(state.message),
),
);
}
},
孩子:BlocBuilder(
生成器:(上下文、状态){
如果(状态为MyInitialState){
返回buildLoading();
}else if(状态为MyLoadingState){
返回buildLoading();
}else if(状态为MyLoadedState){
返回buildArticleList(state.yList);
}else if(状态为MyErrorState){
返回buildErrorUi(state.message);
}
},
),
),
),
),
);
},
),
);
}
小部件构建加载(){
返回中心(
子对象:CircularProgressIndicator(),
);
}
小部件buildErrorUi(字符串消息){
返回中心(
孩子:填充(
填充:常数边集全部(8.0),
子:文本(
消息
样式:TextStyle(颜色:Colors.red),
),
),
);
}
小部件buildArticleList(列表数据){
返回ListView.builder(
itemCount:data.length,
项目生成器:(ctx,pos){
返回填充(
填充:常数边集全部(8.0),
孩子:InkWell(
孩子:ListTile(
标题:文本(数据[pos]。标题),
字幕:文本(数据[pos].shortDesc),
),
onTap:(){
//导航到ArticleDetailPage(上下文、文章[pos]);
},
),
);
},
);
}
}
我刚开始学习bloc,就呆在这里了。。谁能帮忙吗


我没有在main.dart中添加任何与bloc相关的内容。需要吗?

问题在于这一部分:

 BlocProvider<MyBloc>(
            create: (context) => MyBloc());
        Navigator.push(context, MaterialPageRoute(builder: (context) {
          
          return SecondScreen(context);
        }));
BlocProvider(
create:(context)=>MyBloc());
Navigator.push(上下文,MaterialPage路由(生成器:(上下文){
返回第二屏幕(上下文);
}));
将其更改为此可能会修复它:

 BlocProvider<MyBloc>(
            create: (context) => MyBloc());
        Navigator.push(context, MaterialPageRoute(
          builder: (routeContext) => SecondScreen(),
        }));
BlocProvider(
create:(context)=>MyBloc());
Navigator.push(上下文、MaterialPage路由)(
生成器:(routeContext)=>SecondScreen(),
}));

在生成SecondScreen时抛出了以下SecondInitialState对象(状态:_SecondScreenState#fe7f9):SecondInitialState引发错误的相关小部件是SecondScreen lib/../widgets/List。引发异常时,dart:49,这是堆栈#0 MyBloc.initialState#1 new Bloc#2 new MyBloc#3#SecondScreenState.build#4 BuilderStateDelegate.initDelegates似乎与您的集团问题无关,但集团内部的逻辑似乎有问题