Создайте страницу профиля пользователя, используя Bloc, RxDart и Flutter - PullRequest
0 голосов
/ 18 мая 2019

Моя цель - создать страницу редактирования профиля во Flutter, используя шаблон блока.

Я искал лучший / более чистый способ создания страницы профиля пользователя во Flutter с помощью Bloc, но ничего не могу найти.

Прямо сейчас я должен перечислить все поля. Вот пример 2 полей:

final _firstNameController = BehaviorSubject<String>();
final _lastNameController = BehaviorSubject<String>();

Function(String) get firstNameChanged => _firstNameController.sink.add;
Function(String) get lastNameChanged => _lastNameController.sink.add;

Stream<String> get firstNameStream => _firstNameController.stream;
Stream<String> get lastNameStream => _lastNameController.stream;

String get firstName => _firstNameController.value;
String get lastName => _lastNameController.value;


@override
  void dispose() {
_firstNameController?.close();
_lastNameController?.close();
}

Есть намного больше полей, и я не хочу иметь весь этот код, если я могу избежать его.

Я бы предпочел иметь только 1 пользовательский блок и обновлять конкретное поле этого пользователя. Я добавил следующее в блок пользователя.

final _userFetcher = BehaviorSubject<User>();

Observable<User> get userStream => _userFetcher.stream;
User get user => _userFetcher.value;
Function(User) get changeUser => _userFetcher.sink.add;

@override
  void dispose() async {
    await _userFetcher.drain();
    _userFetcher.close();
  }

Вот пример моей пользовательской модели:

class User {

  final Name name;

  User.fromJson(Map<String, dynamic> json)
      : name = Name.fromJson(json);

  Map<String, dynamic> toJson() => {
    "first": name.first,
    "last": name.last,
  };
}

Проблема в том, что я не могу понять, как использовать текстовое поле для редактирования полей «Имя кулака» и «Фамилия» в моей модели «Пользователь».

Возможно ли это, я поступаю неправильно, или я должен придерживаться списка каждого поля по отдельности?

Ответы [ 2 ]

1 голос
/ 19 мая 2019

Индивидуально управлять всеми этими потоками для каждого отдельного поля может быть обременительно. Я бы порекомендовал вам попробовать эту библиотеку flutter bloc . Это действительно хороший инструмент, который хорошо справляется с управлением государством. Вам просто нужно определить состояния и события, а затем для каждого события вы можете создать состояние.

Так, например, вы хотите проверить поле пароля, когда пользователь печатает. Вы определяете событие (например, PasswordChanged). Это вызовет метод в блоке. В котором вы можете написать свою бизнес-логику для проверки правильности.

После вашей логики проверки вы можете получить новое состояние (ошибка, успех). Это приведет к тому, что ваш пользовательский интерфейс будет перестроен, а затем вы сможете обновить свой пользовательский интерфейс в соответствии с вашим состоянием.

Вам следует ознакомиться с документацией этой библиотеки. Там также есть несколько очень хороших примеров.

0 голосов
/ 19 мая 2019

Спасибо всем за помощь!

Мне удалось отредактировать вложенные поля имени и фамилии в моей модели пользователя, которую я перечислил выше, реализовав в моем textField следующее:

onChanged:(text) {
        User thisUser = _bloc.user;
        thisUser.name.last = text;
      }
...