api - 在颤振中热重载后显示restcountries api
问题描述
我在 rest-country API 中使用颤振构建国家名称和标志的应用程序。
当我构建应用程序时不会向我显示来自 API 的数据。
但是当我保存或热重载数据时显示。
我使用 initState() 但仍然没有帮助。
我在列表中插入所有国家的名称和标志,并在 ListView.builder 中显示它们。
主要的
List<String> countriesName = [];
List<String> countriesFlag = [];
NetWork netWork = NetWork();
class _HomePageState extends State<HomePage> {
@override
void initState() {
setState(() {
getNetwork();
});
super.initState();
}
Future getNetwork() async {
countriesName = await netWork.getAllCountries();
countriesFlag = await netWork.getAllCountriesFlag();
}
child: ListView.builder(
itemCount: countriesName.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(
'${countriesName[index]}',
style: TextStyle(
fontSize: 25,
fontWeight: FontWeight.bold,
),
),
subtitle: Hero(
tag: 'flag $index',
child: SvgPicture.network(
'${countriesFlag[index]}', //'https://restcountries.eu/data/gtm.svg'
width: 30,
height: 120,
fit: BoxFit.fitWidth,
),
),
onTap: () {
setState(() {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => CountryDetail(
countriesFlag: countriesFlag,
countriesName: countriesName,
index: index,
netWork: netWork,
)),
);
网络
final urlall = 'https://restcountries.eu/rest/v2/all';
class NetWork {
Future getAllCountries() async {
try {
var response = await http.get(urlall);
if (response.statusCode == 200) {
var jasonData = jsonDecode(response.body);
List<String> countriesName = [];
for (var country in jasonData) {
countriesName.add(country['name']);
}
return countriesName;
}
} catch (e) {
print('e => $e');
}
}
Future getAllCountriesFlag() async {
try {
var response = await http.get(urlall);
if (response.statusCode == 200) {
var jasonData = jsonDecode(response.body);
List<String> countriesFlag = [];
for (var flag in jasonData) {
countriesFlag.add(flag['flag']);
}
return countriesFlag;
}
} catch (e) {
print('e => $e');
}
}
}
- - - -解决方案 - - - -
我找到了解决方案。
Future getNetwork() async {
countriesName = await netWork.getAllCountries();
countriesFlag = await netWork.getAllCountriesFlag();
setState(() {}); // added line
}
解决方案
我还没有测试过,但我在颤振中调用 API 的方式类似于:
List<String> countriesName = [];
List<String> countriesFlag = [];
NetWork netWork = NetWork();
class _HomePageState extends State<HomePage> {
@override
void initState() {
super.initState();
getNetwork();
}
Future getNetwork() async {
setState(() {
countriesName = await netWork.getAllCountries();
countriesFlag = await netWork.getAllCountriesFlag();
});
}
// Build UI code here
然后,您应该检查 countriesName 和 countriesFlag 的值是否为空,然后在 API 返回响应时显示数据。
希望这对您有所帮助。
推荐阅读
- python - 如何在 Python 中创建一个词袋
- python - 对变量执行一系列操作
- rust - 特定于目录的“rustup overrides”存储在哪里?
- reactjs - 为什么这个 useEffect 依赖(正在使用)是不必要的?(埃斯林特日志)
- amazon-web-services - AWS EC2 (c5n.4xlarge) 实例间歇处理/更新滞后
- typescript - Typescript 多个枚举的类型
- python - 在 Python 中将字符串与整数连接起来:Jack and the Beanstalk
- c - 为什么此代码打印单个字符而不是单词?
- scala - 如何在scala spark dataFrame中将模式的DataType转换为另一个
- react-native - react-native -gesture-handler - 如何使用 onHandlerStateChange 和 onPress?