Android flatter:blocprovider.of()调用的上下文不包含类型为的Bloc
我是一个新手,我想用BLoc实现一个简单的登录屏幕。没有生成错误,但在运行时收到以下错误 “使用不包含LoginBloc类型的Bloc的上下文调用blocprovider.of()” 我的代码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
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(上下文)`
}
)