flutter - 即使经过正确的纬度和经度,也可以获得其他位置的天气

标签 flutter dart

我正在使用此天气API,该API需要经纬度才能获取天气。我可以获取位置的经度和纬度(尝试打印它们并且它们是正确的),但是当我在API链接中输入它们时,它会显示其他纬度和经度的天气。我尝试将位置的经纬度手动放置在链接中,它的工作原理绝对不错。有什么问题

import 'package:flutter/material.dart';
import 'package:clima/services/location.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';

double key;

class LoadingScreen extends StatefulWidget {
  @override
  _LoadingScreenState createState() => _LoadingScreenState();
}

class _LoadingScreenState extends State<LoadingScreen> {
  var lati;
  var longi;

  @override
  void initState() {
    super.initState();
  }

  void getData() async {
    http.Response r = await http.get('http://api.weatherstack.c'
        'om/current?access_key=41eb36e0c5f82e3ddce66ef01af877a1&query=$lati,$longi');
    String s = r.body;
    var data1 = jsonDecode(s)['location']['lat'];
    var data2 = jsonDecode(s)['location']['lon'];
    print(data1);
    print(data2);
    print(lati);
    print(longi);
  }

  void getlocation() async {
    location a = location();
    await a.getclocation();
    lati = a.lat;
    longi = a.long;
  }

  Widget build(BuildContext context) {
    getlocation();
    getData();
    return Scaffold();
  }
}
另一个名为location 的类
import 'package:geolocator/geolocator.dart';
class location{

  double lat;
  double long;


  Future<void> getclocation() async{
// this function is defined in another class
   Position position = await Geolocator().getCurrentPosition(desiredAccuracy: LocationAccuracy.low);
  lat=position.latitude;
  long=position.longitude;


    }



}
输出为
41.250
1.300
28.7041
77.1025

最佳答案

您需要等待直到操作真正完成。
有关Future如何工作的更广泛的解释,请参见What is a Future and how do I use it?
如果您具有async函数,则使它返回Future<T>,即使它是Future<void>。然后,如果需要它,请确保对它进行await编码。在用户界面中,您不能仅停止并冻结所有内容,还需要FutureBuilder播放精美的影片并在等待结果时显示一些动画。

class _LoadingScreenState extends State<LoadingScreen> {
  Future<String> getDataFuture;

  @override
  void initState() {
    super.initState();
  
    getDataFuture = getData();
  }

  Future<String> getData() async {
    final position = await Geolocator().getCurrentPosition(desiredAccuracy: LocationAccuracy.low);
    final r = await http.get('http://api.weatherstack.com/current?access_key=41eb36e0c5f82e3ddce66ef01af877a1&query=$position.latitude,$position.longitude');
    return r.body;
  }

  Widget build(BuildContext context) {
    return FutureBuilder(
              future: getDataFuture ,
              builder: (context, snapshot) {
                if(snapshot.hasData) {
                  return Text('Received response: ${snapshot.data}');
                } else if(snapshot.hasError) {
                  return Text('Error: ${snapshot.error.toString()}');
                } else {
                  return CircularProgressIndicator();
                }
  }
}

关于flutter - 即使经过正确的纬度和经度,也可以获得其他位置的天气,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63378492/

相关文章:

layout - 如何在 flutter 中删除列中小部件之间的空间?

flutter - 如何使 Bottom Sheet 格的高度跟随 JSON 的项目数量

dart - 在 Dart 中使用重复键映射实现

flutter - flutter 如何从相机单击正方形图像并显示正方形图像

flutter - 保留选项卡 View 页面之间的状态

flutter - Flutter 中的 Google Places API

function - Flutter GestureDetector无法使用功能

firebase - 如何使用 flutter 和 dart 从 Cloud Firestore 检索特定数据?

firebase - getter 'email' 被调用为 null

flutter - 无法将类型 'List<dynamic>' 的值分配给类型 'List<Todo>' 的变量。尝试改变变量的类型