如何使用 mapEventToState 更改状态?
How do I change the state using mapEventToState?
这是我第一次使用 BLoC
,我不知道如何更改状态。我有一个 TextFormField
和一个 Button
,我希望 Button
将 controller
保存到 User
class 属性 我需要。我了解如何从按钮一侧提供流,但我不了解如何在 UserbloC
class.
中保存更改
class User {
String firstName, sName, phone, email;
User(this.firstName, this.sName, this.phone, this.email);
}
enum EventType { firstName, sName, phone, email }
class UserEvent {
late String value;
late EventType eventType;
UserEvent.firstName(String values) {
this.eventType = EventType.firstName;
this.value = values;
}
UserEvent.sName(String values) {
this.eventType = EventType.sName;
this.value = values;
}
UserEvent.phone(String values) {
this.eventType = EventType.phone;
this.value = values;
}
UserEvent.email(String values) {
this.eventType = EventType.email;
this.value = values;
}
}
class UserBloc extends Bloc<UserEvent, User> {
@override
User get initialState =>
User('Test', 'Test', '+1 999 888-77-66', 'test@gmail.com');
@override
Stream<User> mapEventToState(UserEvent event) async* {
switch (event.eventType) {
case EventType.firstName:
yield null;
break;
case EventType.sName:
yield null;
break;
case EventType.phone:
yield null;
break;
case EventType.email:
yield null;
break;
}
}
}
我通过重写代码解决了问题
class User {
String firstName, sName, phone, email;
User(this.firstName, this.sName, this.phone, this.email);
}
abstract class UserEvent {
const UserEvent();
}
class UpdateFirstName extends UserEvent {
final String firstName;
UpdateFirstName(this.firstName);
}
class UpdateSName extends UserEvent {
final String sName;
UpdateSName(this.sName);
}
class UpdatePhone extends UserEvent {
final String phone;
UpdatePhone(this.phone);
}
class UpdateEmail extends UserEvent {
final String email;
UpdateEmail(this.email);
}
class UserStates {
final String? firstName, sName, phone, email;
UserStates(
{@required this.firstName,
@required this.sName,
@required this.phone,
@required this.email});
}
class FirstNameAdded extends UserStates {
final String? firstName;
FirstNameAdded({required this.firstName}) : super(firstName: firstName);
}
class SNameAdded extends UserStates {
final String? sName;
SNameAdded({required this.sName}) : super(sName: sName);
}
class PhoneAdded extends UserStates {
final String? phone;
PhoneAdded({required this.phone}) : super(phone: phone);
}
class EmailAdded extends UserStates {
final String? email;
EmailAdded({required this.email}) : super(email: email);
}
class UserBloc extends Bloc<UserEvent, UserStates> {
UserBloc()
: super(UserStates(
firstName: 'Владимир',
sName: 'Путин',
phone: '+7 999 888-77-66',
email: 'test@gmailc.com'));
late String _firstName, _sName, _phone, _email;
//@override
//UserStates get initialState = UserStates('Владимир', 'Путин', '+7 999 888-77-66', 'test@gmailc.com');
@override
Stream<UserStates> mapEventToState(UserEvent event) async* {
if (event is UpdateFirstName) {
_firstName = event.firstName;
yield FirstNameAdded(firstName: _firstName);
} else if (event is UpdateSName) {
_sName = event.sName;
yield SNameAdded(sName: _sName);
} else if (event is UpdateEmail) {
_email = event.email;
yield EmailAdded(email: _email);
} else if (event is UpdatePhone) {
_phone = event.phone;
yield PhoneAdded(phone: _phone);
}
}
}
这是我第一次使用 BLoC
,我不知道如何更改状态。我有一个 TextFormField
和一个 Button
,我希望 Button
将 controller
保存到 User
class 属性 我需要。我了解如何从按钮一侧提供流,但我不了解如何在 UserbloC
class.
class User {
String firstName, sName, phone, email;
User(this.firstName, this.sName, this.phone, this.email);
}
enum EventType { firstName, sName, phone, email }
class UserEvent {
late String value;
late EventType eventType;
UserEvent.firstName(String values) {
this.eventType = EventType.firstName;
this.value = values;
}
UserEvent.sName(String values) {
this.eventType = EventType.sName;
this.value = values;
}
UserEvent.phone(String values) {
this.eventType = EventType.phone;
this.value = values;
}
UserEvent.email(String values) {
this.eventType = EventType.email;
this.value = values;
}
}
class UserBloc extends Bloc<UserEvent, User> {
@override
User get initialState =>
User('Test', 'Test', '+1 999 888-77-66', 'test@gmail.com');
@override
Stream<User> mapEventToState(UserEvent event) async* {
switch (event.eventType) {
case EventType.firstName:
yield null;
break;
case EventType.sName:
yield null;
break;
case EventType.phone:
yield null;
break;
case EventType.email:
yield null;
break;
}
}
}
我通过重写代码解决了问题
class User {
String firstName, sName, phone, email;
User(this.firstName, this.sName, this.phone, this.email);
}
abstract class UserEvent {
const UserEvent();
}
class UpdateFirstName extends UserEvent {
final String firstName;
UpdateFirstName(this.firstName);
}
class UpdateSName extends UserEvent {
final String sName;
UpdateSName(this.sName);
}
class UpdatePhone extends UserEvent {
final String phone;
UpdatePhone(this.phone);
}
class UpdateEmail extends UserEvent {
final String email;
UpdateEmail(this.email);
}
class UserStates {
final String? firstName, sName, phone, email;
UserStates(
{@required this.firstName,
@required this.sName,
@required this.phone,
@required this.email});
}
class FirstNameAdded extends UserStates {
final String? firstName;
FirstNameAdded({required this.firstName}) : super(firstName: firstName);
}
class SNameAdded extends UserStates {
final String? sName;
SNameAdded({required this.sName}) : super(sName: sName);
}
class PhoneAdded extends UserStates {
final String? phone;
PhoneAdded({required this.phone}) : super(phone: phone);
}
class EmailAdded extends UserStates {
final String? email;
EmailAdded({required this.email}) : super(email: email);
}
class UserBloc extends Bloc<UserEvent, UserStates> {
UserBloc()
: super(UserStates(
firstName: 'Владимир',
sName: 'Путин',
phone: '+7 999 888-77-66',
email: 'test@gmailc.com'));
late String _firstName, _sName, _phone, _email;
//@override
//UserStates get initialState = UserStates('Владимир', 'Путин', '+7 999 888-77-66', 'test@gmailc.com');
@override
Stream<UserStates> mapEventToState(UserEvent event) async* {
if (event is UpdateFirstName) {
_firstName = event.firstName;
yield FirstNameAdded(firstName: _firstName);
} else if (event is UpdateSName) {
_sName = event.sName;
yield SNameAdded(sName: _sName);
} else if (event is UpdateEmail) {
_email = event.email;
yield EmailAdded(email: _email);
} else if (event is UpdatePhone) {
_phone = event.phone;
yield PhoneAdded(phone: _phone);
}
}
}