Flutter: SetState () обновляет значения, но не отображает их на экране. Это происходит только при использовании обновленных значений внутри Flushbar.

У меня есть текстовое поле внутри панели Flushbar, и текстовое поле использует API Google Places для поиска мест на основе предоставленных входных данных. Я вызываю функцию для параметра «onChanged» текстового поля, как видно из кода, но это не отображается на экране, поскольку что-то вводится в текстовое поле. Хотя печать значений показывает, что значения были обновлены. Кроме того, при открытии и открытии панели смыва отображается ожидаемый результат.

Кроме того, это происходит только при использовании обновленных значений внутри Flushbar. Он отображается на эшафоте, как и ожидалось.

Я знаю, что это похоже на другие вопросы, которые задавали раньше, но мне пока не удалось найти ответы. Я даже обнаружил, что это может происходить, поскольку сам Flushbar не имеет «состояния», и поэтому «setState ()» не влияет на его «содержимое». Но я не знаю, как решить эту проблему. Любая помощь по этому поводу будет принята с благодарностью.

Обновление: я пробовал использовать виджет StatefulBuilder внутри Flushbar, но он дает аналогичные результаты. Я вызвал StaefulBuilder в операторе return после ListView.builder внутри панели Flushbar.

Образец кода:

@override
 Widget build (BuildContext context){
  return Scaffold(
    body : FlatButton(
      child : Text('Search Location'),
      onPressed : Flushbar(
        flushbarPosition: FlushbarPosition.BOTTOM,
        userInputForm : Form(
          child : Container(
           child : Column(
            children : <Widget>[ 
             getSearchFieldFlushBar(),
             _displaySearchedPlaces.length != 0 
               ? ListView.builder(
                   shrinkWrap : true,
                   itemCount : _displaySearchedPlaces.length
                   itemBuilder : (BuildContext context, index){

                     return ListTile(
                       title : Text(_displaySearchedPlaces[index])
                     );
                    }) 
                : Container(height : 0, width : 0),
              ])
             )
           )
          )..show(context);
         ));
        }

Вот функция, вызывающая текстовое поле:

TextFormField getSearchFieldFlushbar(){
 return TextFormField(
  style: TextStyle(color: Colors.black),        
  onChanged: (text) {
    getLocationResults(text);
  },
);
    

И это функция, которая вызывается, когда что-то вводится в текстовое поле:

  void getLocationResults(String input) async {

    String baseURL = 'https://maps.googleapis.com/maps/api/place/autocomplete/json';
    String type = 'geocode';

    String request = '$baseURL?input=$input&key=$places_Api_Key&type=$type';
    Response response = await Dio().get(request);

        final predictions = response.data['predictions'];

        _displayResults = [];

        for (int i = 0; i < predictions.length; i++) {
          String name = predictions[i]['structured_formatting']['main_text'];
          _displayResults.add(name);
        }

        setState(() {
          _displaySearchedPlaces = _displayResults;
        });
        
         print(_searchedPlacesResults);
       }
     }

Снимок экрана1 ScreenShot2


person Chirag Rajgariah    schedule 11.07.2020    source источник


Ответы (1)


Мне наконец удалось исправить это, используя несколько ответов, которые были даны ранее на аналогичные вопросы по Stackoverflow, такие как здесь и здесь.

По сути, мы используем виджет StatefulBuilder и помещаем все дочерние виджеты, которые потенциально могут быть обновлены, внутри этого виджета. Как уже упоминалось в вопросе, использование этого не помогало мне изначально, однако через некоторое время оно начало работать.

Для справки я добавил виджет StatfulBuilder в параметр «child» виджета Form.

person Chirag Rajgariah    schedule 20.07.2020