Флаттер: текст обновляется только после двойного нажатия кнопки - PullRequest
0 голосов
/ 15 апреля 2020

Я только начал создавать приложение погоды во Flutter и столкнулся с проблемой, что получение и отображение местоположения пользователя в виде текстового виджета требует 2 нажатий кнопки FlatButton. Я хочу сделать так, чтобы пользователи только нажимали местоположение FlatButton один раз, чтобы текст обновлялся в соответствии с их текущим местоположением. Вот мой код (я вырезал ненужные детали + шаблонный код):

class _ClimaState extends State<Clima> {
  Position position;
  List<Placemark> placemark;
  String location;

  void getLocation() async {
    position = await Geolocator()
        .getCurrentPosition(desiredAccuracy: LocationAccuracy.lowest);
    placemark = await Geolocator()
        .placemarkFromCoordinates(position.latitude, position.longitude);

    location = placemark[0].locality + ", " + placemark[0].country;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: SafeArea(
          child: Padding(
            padding: const EdgeInsets.all(25.0),
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              crossAxisAlignment: CrossAxisAlignment.center,
              children: <Widget>[

                //I've left out the other children for now

                //This is where I want the user's location to be displayed after they tap the location icon
                Text(
                  placemark != null ? location : "Tap the location icon...",
                  style: TextStyle(
                    color: Colors.white,
                    fontSize: 20,
                    fontWeight: FontWeight.w800,

                  ),

                //This is the location icon
                Padding(
                  padding: const EdgeInsets.only(top: 100.0),
                  child: FlatButton(
                    child: Icon(
                      Icons.my_location,
                      color: Colors.white,
                    ),
                    color: Colors.transparent,
                    onPressed: () {
                      setState(() {
                        getLocation();
                      });
                    },
                  ),
                ),
                ),
              ],
            ),
          ),
        ),
      ),
    );
  }
}

1 Ответ

1 голос
/ 15 апреля 2020

Я думаю, что я выяснил вашу проблему, вызвав набор состояния таким, какой вы есть, вы не ждете, пока ваши данные Geolocator вернутся, прежде чем перестраивать, поэтому для отображения данных требуется два щелчка мышью. Попробуйте эту настройку

  Future<void> getLocation() async {
    position = await Geolocator()
        .getCurrentPosition(desiredAccuracy: LocationAccuracy.lowest);
    placemark = await Geolocator()
        .placemarkFromCoordinates(position.latitude, position.longitude);

    location = placemark[0].locality + ", " + placemark[0].country;
    setState(() {});
  }

//then the onPressed function in your padding widget should be
  onPressed: () async {
              await getLocation();
               },
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...