Flutter 为什么我的应用程序在调用冠状病毒API时抛出错误?
我正在为我的班级建立一个关于冠状病毒跟踪器的项目。每次我试图调用api并点击serach图标时,它都会在控制台中抛出一个错误。我试过很多东西,但都犯了同样的错误。有人能帮忙找出代码的错误吗?Flutter 为什么我的应用程序在调用冠状病毒API时抛出错误?,flutter,flutter-layout,flutter-dependencies,Flutter,Flutter Layout,Flutter Dependencies,我正在为我的班级建立一个关于冠状病毒跟踪器的项目。每次我试图调用api并点击serach图标时,它都会在控制台中抛出一个错误。我试过很多东西,但都犯了同样的错误。有人能帮忙找出代码的错误吗? class _HomePageState extends State<HomePage> { List <Data> data = []; var countryController = TextEditingController(); @
class _HomePageState extends State<HomePage> {
List <Data> data = [];
var countryController = TextEditingController();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Center(child: Text('CoronaVirus Tracker')),
),
body: Column(
children: <Widget>[
Row(
children: <Widget>[
Expanded(
child: TextField(
decoration: InputDecoration(
border: InputBorder.none, hintText: 'Enter a Country'),
controller: countryController,
),
),
IconButton(
icon: Icon(Icons.search),
color: Colors.blue,
onPressed: () {
fetchData().then((newData) {
setState(() {
data = newData as List<Data>;
});
});
}),
],
),
//The search item appear here
Expanded(
child: ListView.builder(
itemBuilder: (BuildContext context, int index) {
return Card(
child: ListTile(
title: Text(data[index].country),
subtitle: Text(data[index].cases),
onTap: () => {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) =>
Text('This is a new page!!')))
},
),
);
},
itemCount: data.length,
),
),
],
));
}
class\u HomePageState扩展状态{
列表数据=[];
var countryController=TextEditingController();
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:中心(子:文本(“冠状病毒跟踪器”),
),
正文:专栏(
儿童:[
划船(
儿童:[
扩大(
孩子:TextField(
装饰:输入装饰(
边框:InputBorder.none,hintText:“输入国家/地区”),
控制器:countryController,
),
),
图标按钮(
图标:图标(Icons.search),
颜色:颜色,蓝色,
已按下:(){
fetchData()。然后((newData){
设置状态(){
数据=列表中的新数据;
});
});
}),
],
),
//搜索项出现在此处
扩大(
子项:ListView.builder(
itemBuilder:(构建上下文,int索引){
回程卡(
孩子:ListTile(
标题:文本(数据[索引].国家),
字幕:文本(数据[索引].案例),
onTap:()=>{
导航器。推(
上下文
材料路线(
生成器:(上下文)=>
Text('这是一个新页面!!'))
},
),
);
},
itemCount:data.length,
),
),
],
));
}
这是Api代码
Future <Data> fetchData() async {
final response = await http.get('https://api.covid19api.com/live/country/malaysia/status/confirmed');
if (response.statusCode == 200) {
print(response.body);
// Transform json into object
return Data.fromJson(json.decode(response.body));
} else {
// If the server did not return a 200 OK response,
// then throw an exception.
throw Exception('Failed to load data');
}
}
}
Future fetchData()异步{
最终响应=等待http.get('https://api.covid19api.com/live/country/malaysia/status/confirmed');
如果(response.statusCode==200){
打印(响应.正文);
//将json转换为对象
返回Data.fromJson(json.decode(response.body));
}否则{
//如果服务器没有返回200 OK响应,
//然后抛出一个异常。
抛出异常(“加载数据失败”);
}
}
}
这是构造函数
class Data {
final String date;
final String country;
final String cases;
Data({this.date, this.country, this.cases});
factory Data.fromJson(Map<String, dynamic> json) {
return Data(
country: json['Country'],
date: json['Date'],
cases: json['Cases']);
}
}
类数据{
最终字符串日期;
最终字符串国家;
最后一串案件;
数据({this.date,this.country,this.cases});
factory Data.fromJson(映射json){
返回数据(
国家:json['country'],
日期:json['date'],
案例:json['cases']);
}
}
根据上述代码,我为您创建了一个示例
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
void main() => runApp(MyApp());
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
bool _isLoading = false;
List<Data> data = List();
TextEditingController countryController = TextEditingController();
Future<List<Data>> fetchData(String countryName) async {
setState(() {
_isLoading = true;
});
//https://api.covid19api.com/live/country/india/status/confirmed
final response = await http.get(
'https://api.covid19api.com/live/country/$countryName/status/confirmed');
print(response.statusCode);
if (response.statusCode == 200) {
print(response.body);
// Transform json into object
var items = json.decode(response.body);
items.forEach((item) {
data.add(Data.fromJson(item));
});
return data;
} else {
// If the server did not return a 200 OK response,
// then throw an exception.
throw Exception('Failed to load data');
}
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Center(child: Text('CoronaVirus Tracker')),
),
body: Column(
children: <Widget>[
Padding(
padding: const EdgeInsets.all(8.0),
child: Row(
children: <Widget>[
Expanded(
child: TextField(
decoration: InputDecoration(
border: InputBorder.none,
hintText: 'Enter a Country'),
controller: countryController,
),
),
IconButton(
icon: Icon(Icons.search),
color: Colors.blue,
onPressed: () {
fetchData(countryController.text).then((newData) {
setState(() {
data = newData;
_isLoading = false;
});
});
}),
],
),
),
_isLoading
? CircularProgressIndicator()
:
//The search item appear here
Expanded(
child: ListView.builder(
itemBuilder: (BuildContext context, int index) {
return Card(
child: ListTile(
title: Text(data[index].date.toString()),
subtitle: Text(data[index].cases.toString()),
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) =>
Text('This is a new page!!')));
},
),
);
},
itemCount: data.length,
),
),
],
)),
);
}
}
class Data {
final String date;
final String country;
final int cases;
Data({this.date, this.country, this.cases});
factory Data.fromJson(Map<String, dynamic> json) {
return Data(
country: json['Country'], date: json['Date'], cases: json['Active']);
}
}
导入'dart:convert';
进口“包装:颤振/材料.省道”;
将“package:http/http.dart”导入为http;
void main()=>runApp(MyApp());
类MyApp扩展了StatefulWidget{
@凌驾
_MyAppState createState()=>\u MyAppState();
}
类MyAppState扩展了状态{
bool_isLoading=false;
列表数据=列表();
TextEditingController countryController=TextEditingController();
未来获取数据(字符串countryName)异步{
设置状态(){
_isLoading=true;
});
//https://api.covid19api.com/live/country/india/status/confirmed
最终响应=等待http.get(
'https://api.covid19api.com/live/country/$countryName/状态/已确认';
打印(响应状态码);
如果(response.statusCode==200){
打印(响应.正文);
//将json转换为对象
var items=json.decode(response.body);
项目。forEach((项目){
data.add(data.fromJson(item));
});
返回数据;
}否则{
//如果服务器没有返回200 OK响应,
//然后抛出一个异常。
抛出异常(“加载数据失败”);
}
}
@凌驾
小部件构建(构建上下文){
返回材料PP(
家:脚手架(
appBar:appBar(
标题:中心(子:文本(“冠状病毒跟踪器”),
),
正文:专栏(
儿童:[
填充物(
填充:常数边集全部(8.0),
孩子:排(
儿童:[
扩大(
孩子:TextField(
装饰:输入装饰(
边框:InputBorder.none,
hintText:‘输入国家’,
控制器:countryController,
),
),
图标按钮(
图标:图标(Icons.search),
颜色:颜色,蓝色,
已按下:(){
fetchData(countryController.text)。然后((newData){
设置状态(){
数据=新数据;
_isLoading=false;
});
});
}),
],
),
),
_卸载
?循环压缩机指示器()
:
//搜索项显示为h