Flutter:使用不包含Bloc类型的上下文调用blocprovider.of()

时间:2020-06-25 16:45:35

标签: android android-studio flutter

我是扑朔迷离的新手,我想使用BLoc实现一个简单的Login屏幕。没有构建错误,但在运行时收到以下错误

“在不包含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,
          ),
        ],
      ),
    );
  },
);
  } 
}

2 个答案:

答案 0 :(得分:2)

您是否在LoginBloc上方的小部件中“提供”了LoginForm

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

如果不这样做,则需要具备以下条件:

BlocProvider<LoginBloc>(
  create: (context) => LoginBloc(),
  builder: (context, state) {
    // LoginForm can now use `BlocProvider.of<LoginBloc>(context)`
  }
)

答案 1 :(得分:0)

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

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

--LoginScreen
   --LoginBloc
     --LoginForm

还要确保您已按照@jack在第一条评论中所说的创建了LogicBloc:

BlocProvider<LoginBloc>(
  create: (context) => LoginBloc(),
  builder: (context, state) {
    // LoginForm can now use `BlocProvider.of<LoginBloc>(context)`
  }
)