dart 我试图使用Flutter集团模式,但我面临着一些问题,这是录音登录按钮两次设置电子邮件和密码值为空

7xllpg7q  于 5个月前  发布在  Flutter
关注(0)|答案(1)|浏览(56)

这是状态类Code

class SignInState {
  String email;
  String password;
  bool passwordVisible;

  SignInState(
      {this.email = "", this.password = "", this.passwordVisible = false});

  List<Object> get props => [this.email, this.password, this.passwordVisible];

  SignInState copyWith(
      {String? email, String? password, bool? passwordVisible}) {
    return SignInState(
        email: email ?? this.email,
        password: password ?? this.password,
        passwordVisible: passwordVisible ?? this.passwordVisible);
  }
}

// class SignInInitial extends SignInState {
//   SignInInitial({
//     String email = "",
//     String password = "",
//     bool passwordVisible = false,
//   }) : super(
//             email: email, password: password, passwordVisible: passwordVisible);
// }

class SignInLoading extends SignInState {}

class SignInSuccess extends SignInState {}

class SignInError extends SignInState {
  final String error;
  SignInError({required this.error});
}

字符串

此为事件类代码

@immutable
    sealed class SignInEvent {}
    
    class SignInEmailEvent extends SignInEvent {
      final String email;
    
      SignInEmailEvent({required this.email});
    }
    
    class SignInPasswordEvent extends SignInEvent {
      final String password;
    
      SignInPasswordEvent({required this.password});
    }
    
    class SignInPasswordVisibleEvent extends SignInEvent {
      final bool passwordVisible;
    
      SignInPasswordVisibleEvent({required this.passwordVisible});
    }
    
    class SignInLoginButtonEvent extends SignInEvent {}
    
    class SignInRegisterButtonEvent extends SignInEvent {
      final String email;
      final String password;
    
      SignInRegisterButtonEvent({required this.email, required this.password});
    }

**This is the BloC Code**

class SignInBloc extends Bloc<SignInEvent, SignInState> {
  SignInBloc() : super(SignInState()) {
    on<SignInEmailEvent>((event, emit) {
      // print("Email is ${event.email}");
      emit(state.copyWith(
        email: event.email,
      ));
    });
    on<SignInPasswordEvent>((event, emit) {
      // print("Email is ${event.password}");
      emit(state.copyWith(password: event.password));
    });
    on<SignInPasswordVisibleEvent>(
      (event, emit) =>
          emit(state.copyWith(passwordVisible: event.passwordVisible)),
    );
    on<SignInLoginButtonEvent>(
      (event, emit) async {
        String email = state.email;
        String password = state.password;

        print("Email is $email" + "Password is $password");

        if (email.isEmpty) {
          // print("Please enter email and password");
          emit(SignInError(error: "Please Enter Email"));
        } else if (password.isEmpty) {
          // print("Please enter email and password");
          emit(SignInError(error: "Please Enter password"));
        }
        try {
          final credential = await FirebaseAuth.instance
              .signInWithEmailAndPassword(email: email, password: password);
          // print("I am Here");
          if (credential.user == null) {
            // print("User Not Found");
            emit(SignInError(error: "User Not Found"));
          }
          if (credential.user!.emailVerified == false) {
            // print("Email Not Verified");
            emit(SignInError(error: "Email Not Verified"));
          }
          var user = credential.user;
          if (user != null) {
            emit(SignInSuccess());
            //emit(SignInSuccess());
          }
        } on FirebaseAuthException catch (e) {
          if (e.code == "user-not-found") {
            //print("User Not Found");
            emit(SignInError(error: "User Not Found"));
          } else if (e.code == 'wrong-password') {
            //print("Wrong Password");
            emit(SignInError(error: "Wrong Password"));
          } else if (e.code == 'invalid-email') {
            //print("Invalid Email");
            emit(SignInError(error: "Invalid Email"));
          }
        }
      },
    );
  }
}

我找不到我哪里做错了。键入电子邮件并按注册按钮打印-电子邮件是miraj密码是键入通行证并按注册按钮打印-电子邮件是密码是123为什么电子邮件/密码设置为空?还有,设置电子邮件并一起传递打印-电子邮件是miraj密码是123再次点击打印-电子邮件是密码是两者都设置为null。如何解决此问题?

nfs0ujit

nfs0ujit1#

只要你调用emit(SignInSuccess());,你就可以将当前状态更改为电子邮件和密码中没有任何数据的状态。
不要使用BaseBloc类的state属性,而是通过事件提供变量。
表单触发了将由块处理的SignInLoginEvent。块基本上将事件转换为状态。UI使用BlocBuilder来显示不同的东西,这取决于从块发出的状态。请注意,BlocBuilder需要是相同类型的BlocProvider的(不一定是直接的)子级。

事件

@immutable
sealed class SignInEvent {}

class SignInLoginEvent extends SignInEvent {
  final String? email;
  final String? password;

  SignInLoginEvent({this.email, this.password});
}

字符串

状态

class SignInState {}

class InitialState extends SignInState {}

class SignInLoading extends SignInState {}

class SignInSuccess extends SignInState {}

class SignInError extends SignInState {
  final String error;

  SignInError({required this.error});
}

区块

class SignInBloc extends Bloc<SignInEvent, SignInState> {
  SignInBloc() : super(InitialState()) {
    on<SignInLoginEvent>(
      (event, emit) async {
        String? email = event.email;
        String? password = event.password;

        if (kDebugMode) {
          print("Email is $email and password is $password");
        }

        if (email != null && email.isEmpty) {
          emit(SignInError(error: "Please Enter Email"));
        } else if (password != null && password.isEmpty) {
          emit(SignInError(error: "Please Enter password"));
        }

        emit(SignInLoading());

        try {
          final credential = await FirebaseAuth.instance
              .signInWithEmailAndPassword(email: email, password: password);
          if (credential.user == null) {
            emit(SignInError(error: "User Not Found"));
          }
          if (credential.user!.emailVerified == false) {
            emit(SignInError(error: "Email Not Verified"));
          }
          var user = credential.user;
          if (user != null) {
            emit(SignInSuccess());
          }
        } on FirebaseAuthException catch (e) {
          if (e.code == "user-not-found") {
            emit(SignInError(error: "User Not Found"));
          } else if (e.code == 'wrong-password') {
            emit(SignInError(error: "Wrong Password"));
          } else if (e.code == 'invalid-email') {
            emit(SignInError(error: "Invalid Email"));
          }
        }
      },
    );
  }
}

登录表单

class Login extends StatefulWidget {
  const Login({Key? key}) : super(key: key);

  @override
  _LoginState createState() => _LoginState();
}

class _LoginState extends State<Login> {
  @override
  Widget build(BuildContext context) {
    return BlocProvider(
      create: (context) => SignInBloc(),
      child: const LoginPage(),
    );
  }
}

class LoginPage extends StatefulWidget {
  const LoginPage({Key? key}) : super(key: key);

  @override
  _LoginPageState createState() => _LoginPageState();
}

class _LoginPageState extends State<LoginPage> {
  @override
  Widget build(BuildContext context) {
    String? email, password;
    return BlocBuilder<SignInBloc, SignInState>(
      builder: (context, state) => Form(
        child: Column(
          children: [
            TextFormField(
              decoration: const InputDecoration(label: Text('Username')),
              onChanged: (value) => email = value,
            ),
            TextFormField(
              decoration: const InputDecoration(label: Text('Password')),
              obscureText: true,
              onChanged: (value) => password = value,
            ),
            ElevatedButton(onPressed: () => {
              context.read<SignInBloc>().add(SignInLoginEvent(email: email, password: password));
            }, child: const Text('Login')),
            switch (state) {
              SignInLoading() => const Text('Trying to sign in...'),
              SignInSuccess() => const Text('Successful signed in'),
              SignInError() => Text(state.error),
              _ => const Text(''),
            }
          ],
        ),
      ),
    );
  }
}

相关问题