flutter LateError(LateInitializationError:字段“latitude”尚未初始化,)

oxiaedzo  于 2023-10-22  发布在  Flutter
关注(0)|答案(4)|浏览(160)

这是我的代码

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

const apiKey = '78c0a5319f932d3e171aa34ab51dd7e3';

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

class _LoadingScreenState extends State<LoadingScreen> {
  late double latitude;
  late double longitude;
  @override
  void initState() {
    super.initState();
    getLocation();
  }

  void getLocation() async {
    Location location = Location();
    await location.getCurrentLocation();
    latitude = location.latitude;
    longitude = location.longitude;
  }

  void getData() async {
    http.Response reponse = await http.get(Uri.parse(
        "https://api.openweathermap.org/data/2.5/weather?lat=$latitude&lon=$longitude&appid=$apiKey"));

    if (reponse.statusCode == 200) {
      String data = reponse.body;

      int condition = jsonDecode(data)['weather'][0]['id'];
      print(condition);
      double temp = jsonDecode(data)['main']['temp']; //main.temp
      print(temp);
      String city = jsonDecode(data)['name']; //name
      print(city);
    } else {
      print(reponse.statusCode);
    }
    print(reponse.body);
  }

  @override
  Widget build(BuildContext context) {
    getData();
    return Scaffold();
  }
}

问题是它说经度和纬度需要后期初始化,当我删除后期时,它会抛出一个错误,说需要初始化。
我试图建立一个天气应用程序使用flutter,但它不断抛出这个错误,我试图删除晚修饰符,但然后它抛出一个错误,说需要初始化。但是如果我保留late修饰符,它会说LateError:
LateInitializationError:字段“latitude”尚未初始化

tzdcorbm

tzdcorbm1#

一个可空的变量才是你想要的,而不是一个迟到的变量。要检查某个东西是否已经初始化,你应该使用一个可空变量,并且你的代码已经设置好了。
只是改变

late MyData data;

MyData? data;
pw136qt2

pw136qt22#

首先,将此代码添加到android/app/src/AndroidManifest.xml文件中

<uses-permission android:name="android.permission.INTERNET">

重建你的APP我希望你的问题会消失。
我面对这个问题,我用这种方式解决了这个问题。

ulydmbyx

ulydmbyx3#

替换:

late double latitude;

有:

late double latitude = "";

尝试在启动画面或更早的画面上请求位置权限。这可以让你在应用程序启动时快速获取纬度和经度。

yrefmtwq

yrefmtwq4#

试试这个功能

void getLocation() async {
    Location location = Location();
    await location.getCurrentLocation();
    setState(() {
      latitude = location.latitude;
      longitude = location.longitude;
    });
  }

相关问题