颤振:第一次点击时不加载数据
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
标记为 async
和 await
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) ;
}
我想在对话框上显示天气名称,但是当我第一次点击按钮时,数据没有加载,只显示对话框,当我第二次点击时,我的数据正在加载。
我想在对话框上显示天气名称,但是当我第一次点击按钮时,数据没有加载,只显示对话框,当我第二次点击时,我的数据正在加载。
我想在第一次点击时显示我的数据,请帮助如何做到这一点。
这是我的代码
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
标记为 async
和 await
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) ;
}