TextField сохраняет старое значение - PullRequest
0 голосов
/ 17 июня 2020

У меня проблема с флаттером текстового поля. Мне нужно получить город или почтовый индекс, чтобы перенаправить пользователя на другую страницу. Но похоже, что я сохраняю старое значение, даже если текст внутри текстового поля изменяется. Я пытался очистить его, поставить условия, но не понимаю, почему текст не сохраняет текущее значение. Вот код:

Проверить, если это Париж, для района

 @override
 void initState() {
    editingController.addListener((){
       setState(() {
         if(editingController.text.isEmpty) {
           editingController.clear();
           isParis = false;
         }
      });
   });
 super.initState();
}

Кнопка, которая перенаправляет, метод getPcFromQuery (это метод asyn c) извлекает данные, относящиеся к названию города .

RaisedButton(
  onPressed: (){
    print(editingController.text);
    getPCFromQuery(editingController.text)
      .then((town) {city = town.featureName; postalCode = town.postalCode;});
       setState(() {
         if(city.toString().toLowerCase() == "paris")
           isParis = true;
         else
           isParis = false;
         });
      print("postalCode : $postalCode");
      postalCode != null && city.toString().toLowerCase() != "paris"?
      Navigator.of(context).push(MaterialPageRoute(builder: (context) => PreferencesPage(postalCode: postalCode))) :
      Container(child: Text(""));
    })

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

Вы знаете, откуда это может появиться?

Это построено TextField:

class SearchBar extends StatelessWidget {
    const SearchBar({
    Key key,
    @required this.editingController,
   }) : super(key: key) ;

  final TextEditingController editingController;

  @override
  Widget build(BuildContext context) {
    return Container(
        decoration: BoxDecoration(
        color: Colors.grey.withOpacity(0.1),
        borderRadius: BorderRadius.circular(10.0)),
        child: TextField(
           controller: editingController,
           decoration: InputDecoration(
             hintText: AppStrings.searchTown,
             hintStyle: GoogleFonts.notoSans(fontSize: 14.0),
             border: InputBorder.none,
             fillColor: Colors.grey.withOpacity(0.5),
             prefixIcon: Icon(Icons.search, color: Colors.grey)
           ),
        )
    );
  }
 }

И метод _getPcFromQuery:

_getPCFromQuery(String city) async {
   var addresses = await Geocoder.local.findAddressesFromQuery(city);
   var first = addresses.first;

   print(first.featureName);
   print(first.addressLine);

   return first;
}

Странная вещь когда я пробую первый раз, печать внутри метода _getPcFromQuery получает текст, но печать "print (" postalCode: $ postalCode ");" на кнопке метода onPressed имеет значение null.

1 Ответ

0 голосов
/ 23 июня 2020

Укажите ключевой параметр для TextField.

class SearchBar extends StatelessWidget {
  const SearchBar({
    Key key,
    @required this.editingController,
   }) : super(key: key) ;

  final TextEditingController editingController;

  final searchKey = GlobalKey(); // <-- create a global key

  @override
  Widget build(BuildContext context) {
    return Container(
        decoration: BoxDecoration(
        color: Colors.grey.withOpacity(0.1),
        borderRadius: BorderRadius.circular(10.0)),
        child: TextField(
           key: searchKey, // <-- specify the declared key here
           controller: editingController,
           decoration: InputDecoration(
             hintText: AppStrings.searchTown,
             hintStyle: GoogleFonts.notoSans(fontSize: 14.0),
             border: InputBorder.none,
             fillColor: Colors.grey.withOpacity(0.5),
             prefixIcon: Icon(Icons.search, color: Colors.grey)
           ),
        )
    );
  }
}
...