Невозможно отобразить данные в форме

#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 и об использовании здесь контроллера редактирования текста

также, если у вас возникнут трудности с пониманием использования здесь, дайте мне знать в комментариях