颤振:第一次点击时不加载数据

flutter: Not load data on first click

我想在对话框上显示天气名称,但是当我第一次点击按钮时,数据没有加载,只显示对话框,当我第二次点击时,我的数据正在加载。

我想在对话框上显示天气名称,但是当我第一次点击按钮时,数据没有加载,只显示对话框,当我第二次点击时,我的数据正在加载。

我想在第一次点击时显示我的数据,请帮助如何做到这一点。

这是我的代码

import 'package:flutter/material.dart';
import 'package:geolocator/geolocator.dart';
import 'package:weather/weather.dart';


void main() => runApp(MyAppp());



class MyAppp extends StatefulWidget {
  const MyAppp({ Key? key }) : super(key: key);

  @override
  _MyApppState createState() => _MyApppState();
}

class _MyApppState extends State<MyAppp> {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home:ButtonPage()
      
    );
  }
}

class ButtonPage extends StatefulWidget {
  const ButtonPage({ Key? key }) : super(key: key);

  @override
  _ButtonPageState createState() => _ButtonPageState();
}

class _ButtonPageState extends State<ButtonPage> {

    // passing this to latitude and longitude strings
     String key = '856822fd8e22db5e1ba48c0e7d69844a';
  late WeatherFactory ws;
  List<Weather> _data = [];
  double? lat, lon;

  @override
  void initState() {
    super.initState();
    ws = new WeatherFactory(key);
    
  }



void getCurrentLocation() async {

    var position = await Geolocator.getCurrentPosition(
        desiredAccuracy: LocationAccuracy.high);
    var lat = position.latitude;
    var long = position.longitude;


  print(lat);
  print(long);
queryWeather( lat,long) ;
  }


 queryWeather(var lat,var long) async {
       print("Data: "+_data.toString());
    /// Removes keyboard
    FocusScope.of(context).requestFocus(FocusNode());

  
    Weather weather = await ws.currentWeatherByLocation(lat, long);
    setState(() {
      _data = [weather];
    });
  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(child: RaisedButton(onPressed: () { 
getCurrentLocation();
showDialog<void>(
    context: context,
    // barrierDismissible: false, // user must tap button!
    builder: (BuildContext context) {
      return Dialog(
        child: Center(
        child: ListView.builder(
          itemCount: _data.length,
          itemBuilder: (context, index) {
            return ListTile(
              title: Text("${_data[index].areaName}"),
            );
          },
         
        ),
          ),
      );
    },
  );

       },
      child: Text("Button"),),),
      
    );
  }
}

我正在使用这个权限

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
weather: ^2.0.1
  geolocator: ^7.4.0
  url_launcher: ^6.0.9

因为 getCurrentLocation 是异步的,你必须将你的 onPressed 标记为 asyncawait getCurrentLocation:

的结果
Widget build(BuildContext context) {
    return Scaffold(
      body: Center(child: RaisedButton(onPressed: () async { 
         await getCurrentLocation();
         ...

您还必须 await queryWeather 调用:

void getCurrentLocation() async {

    var position = await Geolocator.getCurrentPosition(
        desiredAccuracy: LocationAccuracy.high);
    var lat = position.latitude;
    var long = position.longitude;

    await queryWeather( lat,long) ;
  }