如何使用 mapEventToState 更改状态?

How do I change the state using mapEventToState?

这是我第一次使用 BLoC,我不知道如何更改状态。我有一个 TextFormField 和一个 Button,我希望 Buttoncontroller 保存到 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);
    }
  }
}