【问题标题】:flutter: Not load data on first click颤振:第一次点击时不加载数据
【发布时间】:2021-11-03 16:54:14
【问题描述】:

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

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

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

这是我的代码

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

【问题讨论】:

    标签: flutter dart flutter-dependencies flutter-animation flutter-test


    【解决方案1】:

    由于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) ;
      }
    

    【讨论】:

      猜你喜欢
      • 2021-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多