如何在登录页面中使用BLoC

时间:2019-12-09 01:44:13

标签: flutter state bloc

我有一个登录页面,其中包含两个TextFormField。 如何使用BLoC保留这两个TextFormField文本,当我按下登录按钮时,我可以同时获得这两个TextFormField

ps:我想将登录表单放在一个文件中。

我知道如何在BLoC中保持一个状态,例如计数状态,通过接收器进行添加,并通过流进行重新渲染。 BLoC中的两个状态怎么样

任何时候都可以给我一些提示,谢谢

1 个答案:

答案 0 :(得分:0)

您可以遵循此https://bloclibrary.dev/#/flutterlogintutorial?id=setup
逐步创建包含软件包flutter_bloc

的登录表单

登录表单的代码段

import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_login/login/login.dart';

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 BlocListener<LoginBloc, LoginState>(
      listener: (context, state) {
        if (state is LoginFailure) {
          Scaffold.of(context).showSnackBar(
            SnackBar(
              content: Text('${state.error}'),
              backgroundColor: Colors.red,
            ),
          );
        }
      },
      child: 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! LoginLoading ? _onLoginButtonPressed : null,
                  child: Text('Login'),
                ),
                Container(
                  child: state is LoginLoading
                      ? CircularProgressIndicator()
                      : null,
                ),
              ],
            ),
          );
        },
      ),
    );
  }
}

enter image description here