EmailTextInput
Email 입력을 위한 TextField 위젯입니다.
- email 입력에 대한 유효성 검사를 수행합니다.
 - bloc를 사용하여 상태관리를 수행합니다.
 
사용법
- 패키지 임포트하기:
 
import 'package:yir_ui/yir_ui.dart';
- BlocProvider를 사용하여 Bloc을 등록하기:
 
body: BlocProvider(
        create: (context) => EmailTextInputBloc(),
        child: const SignInScreen(),
      ),
- BlocBuilder를 사용하여 Bloc을 사용하기:
 
class EmailTextInput extends StatelessWidget {
  const EmailTextInput({super.key});
  
  Widget build(BuildContext context) {
    return BlocBuilder<EmailTextInputBloc, EmailTextInputState>(
        builder: (context, state) {
      if (state is EmailTextInputInitialState) {
        return EmaiTextInputField(
          onChanged: (email) {
            BlocProvider.of<EmailTextInputBloc>(context)
                .add(EmailTextInputChangedEvent(email));
          },
        );
      }
      if (state is EmailTextInputChangedState) {
        return EmaiTextInputField(
          errorMessage: state.status.isFailure
              ? Email.showEmailErrorMessage(state.email.error)
              : null,
          onChanged: (email) {
            BlocProvider.of<EmailTextInputBloc>(context)
                .add(EmailTextInputChangedEvent(email));
          },
        );
      } else {
        return const SizedBox.shrink();
      }
    });
  }
}
- state데이터를 받아오기:
 
TextButton(
           onPressed: () {
						  // 获取EmailTextInputBloc的state。
              final currentState =
                 BlocProvider.of<EmailTextInputBloc>(context).state;
							// 根据state类型获取其实例的值。
               if (currentState is EmailTextInputChangedState) {
                      print(currentState.email.value); // Email 객체의 value 속성을 출력
                    }
                  },
                  child: const Text('Sign In')),
개발 스탭
step1: 创建Event
part of 'email_text_input_bloc.dart';
sealed class EmailTextInputEvent {}
class EmailTextInputInitialEvent extends EmailTextInputEvent {}
class EmailTextInputChangedEvent extends EmailTextInputEvent {
  //这个是参数
  final String email;
  EmailTextInputChangedEvent(this.email);
}
常用的Event是否有 【get, create, update, delete】 呢?
step2: 创建state
import 'package:equatable/equatable.dart';
import 'package:yir_formz/yir_formz.dart';
import 'package:formz/formz.dart';
sealed class EmailTextInputState {}
final class EmailTextInputInitialState extends EmailTextInputState {}
final class EmailTextInputChangedState extends EmailTextInputState
    with EquatableMixin {
  final Email email;
  final FormzSubmissionStatus status;
  EmailTextInputChangedState({
    this.email = const Email.pure(),
    this.status = FormzSubmissionStatus.initial,
  });
  
  List<Object?> get props => [
        email,
        status,
      ];
}
这里没有创建ErrorState。因为Formz有自带的。
常用的应该有【Initial,loading,success,error】等状态state。
step3: 创建Bloc
import 'package:bloc/bloc.dart';
import 'package:formz/formz.dart';
import 'package:meta/meta.dart';
import 'package:yir_formz/yir_formz.dart';
import 'email_text_input_state.dart';
part 'email_text_input_event.dart';
class EmailTextInputBloc
    extends Bloc<EmailTextInputEvent, EmailTextInputState> {
  EmailTextInputBloc() : super(EmailTextInputInitialState()) {
    on<EmailTextInputEvent>((event, emit) {
      if (event is EmailTextInputInitialEvent) {
        emit(
          EmailTextInputInitialState(),
        );
      }
      if (event is EmailTextInputChangedEvent) {
				// 通过event获取参数
        final email = Email.dirty(event.email);
        final status = Formz.validate([
          email,
        ])
            ? FormzSubmissionStatus.success
            : FormzSubmissionStatus.failure;
        emit(
          EmailTextInputChangedState(
            email: email,
            status: status,
          ),
        );
      }
    });
  }
}
Bloc是以Event为主线写逻辑代码。
step4: 注册BlocProvider
body: BlocProvider(
        create: (context) => EmailTextInputBloc(),
        child: const SignInScreen(),
      ),
step5: 调用BlocBuilder
class EmailTextInput extends StatelessWidget {
  const EmailTextInput({super.key});
  
  Widget build(BuildContext context) {
    return BlocBuilder<EmailTextInputBloc, EmailTextInputState>(
        builder: (context, state) {
      if (state is EmailTextInputInitialState) {
        return EmaiTextInputField(
          onChanged: (email) {
            BlocProvider.of<EmailTextInputBloc>(context)
                .add(EmailTextInputChangedEvent(email));
          },
        );
      }
      if (state is EmailTextInputChangedState) {
        return EmaiTextInputField(
          errorMessage: state.status.isFailure
              ? Email.showEmailErrorMessage(state.email.error)
              : null,
          onChanged: (email) {
            BlocProvider.of<EmailTextInputBloc>(context)
                .add(EmailTextInputChangedEvent(email));
          },
        );
      } else {
        return const SizedBox.shrink();
      }
    });
  }
}
BlocBuilder是以状态state为主线写代码。
登入页面-点击登入按钮时
TextButton(
           onPressed: () {
						  // 获取EmailTextInputBloc的state。
              final currentState =
                 BlocProvider.of<EmailTextInputBloc>(context).state;
							// 根据state类型获取其实例的值。
               if (currentState is EmailTextInputChangedState) {
                      print(currentState.email.value); // Email 객체의 value 속성을 출력
                    }
                  },
                  child: const Text('Sign In')),
通过这种方法就能获取到email值。