Текстовое поле остается пустым после изменения StreamBuilder - PullRequest
0 голосов
/ 01 октября 2019

Я пытаюсь сделать запрос для проверки имени пользователя, но когда StreamBuilder меняет свое состояние на Загрузка, я теряю значения полей, как я могу это сделать? Сохранять состояния полей после перезагрузки StreamBuilder.

CustomTextFormField - это просто StatefullWidget.

RegisterScreen - это мой интерфейс, я хочу показать пользователю, что экран находится в состоянии загрузки, во время проверки полейв API.

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

class _RegisterScreenState extends State<RegisterScreen> {
  RegisterBloc _registerBloc;
  GlobalKey<FormState> controller;

  @override
  void initState() {
    controller = GlobalKey<FormState>();
    _registerBloc = BlocProvider.getBloc<RegisterBloc>();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        elevation: 0,
        title: Text("Nova conta"),
        centerTitle: true,
        backgroundColor: Theme.of(context).canvasColor,
      ),
      body: StreamBuilder<ApiResponse>(
        stream: _registerBloc.outState,
        initialData: ApiResponse.idle(),
        builder: (context, snapshot) {
          switch (snapshot.data.status) {
            case Status.LOADING:
              return LoaderComponent();
              break;
            case Status.COMPLETED:
            case Status.ERROR:
            case Status.IDLE:
              return SingleChildScrollView(
              child: Form(
                key: controller,
                child: Container(
                  padding: EdgeInsets.all(16.0),
                  child: Column(
                    children: <Widget>[
                      CustomTextFormFieldComponent(
                        onSaved: (value) => _registerBloc.user.name = value,
                        validator: (value) => _registerBloc.required(value),
                        label: "Nome",
                      ),
                      ImagePickerComponent(
                        callback: (file) {
                          _registerBloc.inFile(file);
                        },
                      ),
                      MaterialButton(
                        minWidth: double.infinity,
                        color: Theme.of(context).primaryColor,
                        height: 48.0,
                        onPressed: () {
                          if (controller.currentState.validate()) {
                            controller.currentState.save();
                            _registerBloc.checkUsername(_registerBloc.user.username);
                          }
                        },
                        child: Center(
                          child: Text("Criar conta"),
                        ),
                      ),
                    ],
                  ),
                ),
              ),
            );
            break;
          }

          return Container();
        }
      ),
    );
  }
}

class RegisterBloc extends BlocBase with RegisterValidators {

  BehaviorSubject<ApiResponse> _stateController;
  BehaviorSubject<File> _fileController;
  UserService _userService;
  UserModel user;

  Stream<ApiResponse> get outState => _stateController.stream;

  Function get inState => _stateController.sink.add;
  Function get inFile => _fileController.sink.add;

  RegisterBloc() {
    _userService = UserService();

    _stateController = BehaviorSubject<ApiResponse>();
  }

  checkUsername(String username) async {
    inState(ApiResponse.loading());

    try {
      ApiResponseModel response = await _userService.checkUsername(username);
      inState(ApiResponse.idle());
      return response.data ? "Já existe um usuário com esse nome de usuário" : null;
    } catch (e) {
      print(e);
    }
  }

  @override
  void dispose() {
    _stateController.close();
    super.dispose();
  }
}```
...