Android flatter:blocprovider.of()调用的上下文不包含类型为的Bloc

Android flatter:blocprovider.of()调用的上下文不包含类型为的Bloc,android,android-studio,flutter,Android,Android Studio,Flutter,我是一个新手,我想用BLoc实现一个简单的登录屏幕。没有生成错误,但在运行时收到以下错误 “使用不包含LoginBloc类型的Bloc的上下文调用blocprovider.of()” 我的代码 class LoginForm extends StatefulWidget { @override State<LoginForm> createState() => _LoginFormState(); } class _LoginFormState extends S

我是一个新手,我想用BLoc实现一个简单的登录屏幕。没有生成错误,但在运行时收到以下错误

“使用不包含LoginBloc类型的Bloc的上下文调用blocprovider.of()”

我的代码

class LoginForm extends StatefulWidget {
   @override
   State<LoginForm> createState() => _LoginFormState();
}

class _LoginFormState extends State<LoginForm> {
  final _usernameController = TextEditingController();
  final _passwordController = TextEditingController();

  @override
  Widget build(BuildContext context) {
_onLoginButtonPressed() {
  BlocProvider.of<LoginBloc>(context).add(
    LoginButtonPressed(
      username: _usernameController.text,
      password: _passwordController.text,
    ),
  );
}

return BlocBuilder<LoginBloc, LoginState>(
  builder: (context, state) {
    return Form(
      child: Column(
        children: [
          TextFormField(
            decoration: InputDecoration(labelText: 'username'),
            controller: _usernameController,
          ),
          TextFormField(
            decoration: InputDecoration(labelText: 'password'),
            controller: _passwordController,
            obscureText: true,
          ),
          RaisedButton(
            onPressed:
                state is! LoginInProgress ? _onLoginButtonPressed : null,
            child: Text('Login'),
          ),
          Container(
            child: state is LoginInProgress
                ? CircularProgressIndicator()
                : null,
          ),
        ],
      ),
    );
  },
);
  } 
}
classloginform扩展StatefulWidget{
@凌驾
State createState()=>\u LoginFormState();
}
类_LoginFormState扩展状态{
final _usernameController=TextEditingController();
final _passwordController=TextEditingController();
@凌驾
小部件构建(构建上下文){
_onLoginButtonPressed(){
BlocProvider.of(上下文)。添加(
登录按钮按下(
用户名:_usernameController.text,
密码:_passwordController.text,
),
);
}
返回BlocBuilder(
生成器:(上下文、状态){
报税表(
子:列(
儿童:[
TextFormField(
装饰:输入装饰(标签文本:“用户名”),
控制器:\ u usernameController,
),
TextFormField(
装饰:输入装饰(标签文本:“密码”),
控制器:_passwordController,
蒙昧文字:对,
),
升起的按钮(
按下按钮:
状态为!LoginProgress?\u onLoginButtonPressed:null,
子项:文本('Login'),
),
容器(
孩子:状态正在进行中
?循环压缩机指示器()
:null,
),
],
),
);
},
);
} 
}
您是否在
LoginForm
上方的小部件中“提供”了
LoginBloc

此错误意味着没有父窗口小部件引用已创建的
LoginBloc

如果没有,您需要:

BlocProvider<LoginBloc>(
  create: (context) => LoginBloc(),
  builder: (context, state) {
    // LoginForm can now use `BlocProvider.of<LoginBloc>(context)`
  }
)
BlocProvider<LoginBloc>(
  create: (context) => LoginBloc(),
  builder: (context, state) {
    // LoginForm can now use `BlocProvider.of<LoginBloc>(context)`
  }
)
BlocProvider(
create:(context)=>LoginBloc(),
生成器:(上下文、状态){
//LoginForm现在可以使用`BlocProvider.of(上下文)`
}
)

确保
LoginForm
位于开发工具的
LoginBloc
小部件树下。可能您正在使用
AuthPage
中的
Navigator.push()
打开新的登录表单。如果您这样做,则
loginForm
将再次呈现为新页面,而不将
LoginPage
作为父页面。因此,请尝试将
LoginForm
保存在
LoginScreen

您的小部件树应该如下所示:

--LoginScreen
   --LoginBloc
     --LoginForm
还要确保您创建了LogicBloc,正如@jack在第一条评论中所说:

BlocProvider(
create:(context)=>LoginBloc(),
生成器:(上下文、状态){
//LoginForm现在可以使用`BlocProvider.of(上下文)`
}
)