Я хочу создать TextField, которое проверяет, существует ли значение в базе данных.
Как выполнить асинхронную проверку с использованием шаблона BLOC с виджетом TextField
?Должен ли я использовать StreamTransformer
, чтобы добавить ошибку к Stream
?Я пытался использовать DebounceStreamTransformer
, но он просто блокирует Stream
от получения нового значения.
Это мой Observable
Observable<String> get valueStream => valueController.stream.transform(PropertyNameExist.handle('Blabla', null));
Это мой StreamTransformer
class PropertyNameExist implements StreamTransformerValidator {
static StreamTransformer<String, String> handle(String fieldname, String data) {
Http http = new Http();
return StreamTransformer<String, String>.fromHandlers(
handleData: (String stringData, sink) {
http.post('/my_api',data:{
'property_name':stringData,
}).then((Response response){
Map<String,dynamic> responseData = jsonDecode(response.data);
bool isValid = responseData['valid'] == 'true';
if(isValid){
sink.add(stringData);
} else {
sink.addError('Opps Error');
}
});
});
}
}
Это мой Widget
StreamBuilder<String>(
stream: valueStream,
builder: (context, AsyncSnapshot<String> snapshot) {
if (snapshot.hasData) {
_textInputController.setTextAndPosition(snapshot.data);
}
return TextField(
controller: _textInputController,
onChanged: (String newVal) {
updateValue(newVal);
},
decoration: InputDecoration(
errorText: snapshot.error,
),
);
},
)