#flutter #dart
#трепетание #dart
Вопрос:
Следующая функция извлекает данные из Firebase, и я использую данные для предварительного заполнения формы. Однако форма не заполнена предварительно, хотя я успешно извлекаю данные. Я предполагаю, что это как-то связано с логикой async и await, но я не уверен, в чем именно проблема. Буду признателен за ваш вклад.
Функция
Future<Address> fetchAddress() async {
final url = 'https://mamp;m.firebaseio.com/address/$userId.json?auth=$authToken';
try {
final response = await http.get(url);
final extractedData = json.decode(response.body) as Map<String, dynamic>;
if (extractedData == null || extractedData['error'] != null) {
return null;
}
//I can see the data in the logs
print('Exctracted data is ' extractedData.toString());
// print(extractedData.)
var address = Address(
name: extractedData['name'],
details:extractedData['details'],
phoneNumber: extractedData['phoneNumber'],
alternatePhone: extractedData['alternatePhone']
) ;
return address;
} catch (error) {
print('Inside error');
print(error);
throw (error);
}
}
В address_screen.dart
файле я пытаюсь установить данные внутри функции didChangeDependecies, как показано ниже:
@override
void didChangeDependencies() async{
if (_isInit) {
setState(() {
_isLoading = true;
});
await Provider.of<Addresses>(context, listen: true).fetchAddress().
then(
(value){
print('inside value');
print(value == null);
if(value != null)
_editedAddress = value;
}
);
_initValues = {
'name': _editedAddress.name,
'details': _editedAddress.details,
'alternatePhone': _editedAddress.alternatePhone,
};
}
setState(() {
_isLoading = false;
});
_isInit = false;
super.didChangeDependencies();
}
Как я уже упоминал, когда я регистрирую результаты своей функции, я вижу значения из базы данных. Но форма не заполняется предварительно.
Вот как я настраиваю форму (показывая часть формы, чтобы избежать длины кода)
child: Form(
key: _form,
child: ListView(
children: <Widget>[
TextFormField(
initialValue: _initValues['name'],
decoration: InputDecoration(labelText: 'Contact name'),
textInputAction: TextInputAction.next,
onFieldSubmitted: (_) {
FocusScope.of(context).requestFocus(_nameFocusNode);
},
validator: (value) {
if (value.isEmpty) {
return 'Please provide a name.';
}
return null;
},
onSaved: (value) {
_editedAddress = Address(
name: value,
details: _editedAddress.details,
alternatePhone: _editedAddress.alternatePhone,
);
},
),
Ответ №1:
Я бы рекомендовал вам использовать TextEditingController для обновления текстовых полей нужным текстом.
Пример:
class WidgetText extends StatefulWidget {
@override
_LoginViewState createState() => _WidgetTextState();
}
class _WidgetTextState extends State<WidgetText> {
final TextEditingController _textTextEditingController =
TextEditingController();
@override
void initState() {
super.initState();
_textTextEditingController.text = 'This updates your text field';
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: TextFormField(
controller: _textTextEditingController,
),
);
}
}
Надеюсь, это помогло.
Ответ №2:
Итак, проблема здесь в том, что вы используете initialValue:
свойство, но проблема в том, что оно вызывается только 1-й раз во время сборки.
Попробуйте использовать controller:
свойство, которое принимает TextEditingController
значение, и вы можете установить значение вашего _controller
in didChangeDependencies
узнайте больше о TextEditingController и об использовании здесь контроллера редактирования текста
также, если у вас возникнут трудности с пониманием использования здесь, дайте мне знать в комментариях