Flutter:如何在 UI 中访问 API 中的元素
Flutter: How can I access element from API in my UI
我成功从 API 获取数据。我使用 Print 命令测试它,元素成功显示在控制台中。当我尝试访问 TEXT Widget 中的相同元素时,它显示为 null。
代码如下:
import 'package:api_practice/worker/data.dart';
import 'package:flutter/material.dart';
import 'package:api_practice/worker/data.dart';
class WeatherHome extends StatefulWidget {
@override
_WeatherHomeState createState() => _WeatherHomeState();
}
class _WeatherHomeState extends State<WeatherHome> {
TextEditingController searchcont = TextEditingController();
DataClass datainstace = DataClass();
void data() async {
await datainstace.getcurrentlocation();
await datainstace.getdata();
print(datainstace.area);
}
@override
void initState() {
data();
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child:Text(
("${datainstace.area}"),
style: TextStyle(fontSize: 25, color: Colors.white),
),
);
}
}
控制台输出:output in console
应用看起来像:appscreen
您应该在 data 函数中使用 setState 方法。因为您的构建方法在您的异步方法之前完成。
这样使用:
import 'package:api_practice/worker/data.dart';
import 'package:flutter/material.dart';
import 'package:api_practice/worker/data.dart';
class WeatherHome extends StatefulWidget {
@override
_WeatherHomeState createState() => _WeatherHomeState();
}
class _WeatherHomeState extends State<WeatherHome> {
TextEditingController searchcont = TextEditingController();
DataClass datainstace = DataClass();
void data() async {
await datainstace.getcurrentlocation();
await datainstace.getdata();
print(datainstace.area);
setState(() {});
}
@override
void initState() {
data();
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child:Text(
"${datainstace.area}",
style: TextStyle(fontSize: 25, color: Colors.white),
),
);
}
}
当您想更新小部件的状态时,您必须调用 setState 函数使小部件重新呈现更改。
void data() {
setState(() async {
await datainstace.getcurrentlocation();
await datainstace.getdata();
print(datainstace.area);
});
}
除了前面的答案之外,您还可以使用值可听构建器,这会提高性能,因此无需使用 setState。
您可以查看以下link以获取有关如何使用它的信息
Explore ValueListenableBuilder in Flutter
我成功从 API 获取数据。我使用 Print 命令测试它,元素成功显示在控制台中。当我尝试访问 TEXT Widget 中的相同元素时,它显示为 null。
代码如下:
import 'package:api_practice/worker/data.dart';
import 'package:flutter/material.dart';
import 'package:api_practice/worker/data.dart';
class WeatherHome extends StatefulWidget {
@override
_WeatherHomeState createState() => _WeatherHomeState();
}
class _WeatherHomeState extends State<WeatherHome> {
TextEditingController searchcont = TextEditingController();
DataClass datainstace = DataClass();
void data() async {
await datainstace.getcurrentlocation();
await datainstace.getdata();
print(datainstace.area);
}
@override
void initState() {
data();
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child:Text(
("${datainstace.area}"),
style: TextStyle(fontSize: 25, color: Colors.white),
),
);
}
}
控制台输出:output in console
应用看起来像:appscreen
您应该在 data 函数中使用 setState 方法。因为您的构建方法在您的异步方法之前完成。
这样使用:
import 'package:api_practice/worker/data.dart';
import 'package:flutter/material.dart';
import 'package:api_practice/worker/data.dart';
class WeatherHome extends StatefulWidget {
@override
_WeatherHomeState createState() => _WeatherHomeState();
}
class _WeatherHomeState extends State<WeatherHome> {
TextEditingController searchcont = TextEditingController();
DataClass datainstace = DataClass();
void data() async {
await datainstace.getcurrentlocation();
await datainstace.getdata();
print(datainstace.area);
setState(() {});
}
@override
void initState() {
data();
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child:Text(
"${datainstace.area}",
style: TextStyle(fontSize: 25, color: Colors.white),
),
);
}
}
当您想更新小部件的状态时,您必须调用 setState 函数使小部件重新呈现更改。
void data() {
setState(() async {
await datainstace.getcurrentlocation();
await datainstace.getdata();
print(datainstace.area);
});
}
除了前面的答案之外,您还可以使用值可听构建器,这会提高性能,因此无需使用 setState。
您可以查看以下link以获取有关如何使用它的信息 Explore ValueListenableBuilder in Flutter