Я пытаюсь сделать запрос для проверки имени пользователя, но когда 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();
}
}```