Flutter Can';无法从api获取数据
当我在应用逻辑后在API页面中从主页传递值时,我并没有在结果变量中获取数据。我做错了什么 这是我的主页,我在这里传递值-Flutter Can';无法从api获取数据,flutter,Flutter,当我在应用逻辑后在API页面中从主页传递值时,我并没有在结果变量中获取数据。我做错了什么 这是我的主页,我在这里传递值- import 'package:flutter/material.dart'; import 'sourceScreen.dart'; import 'models/API.dart'; class Home extends StatefulWidget { @override _HomeState createState() => _HomeState();
import 'package:flutter/material.dart';
import 'sourceScreen.dart';
import 'models/API.dart';
class Home extends StatefulWidget {
@override
_HomeState createState() => _HomeState();
}
class _HomeState extends State<Home> {
int value=0;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title:Text("uTTerNews")),
body: Center(
child: Column(
children: <Widget>[
FlatButton(
onPressed: (){
Navigator.push(context, MaterialPageRoute(builder: (context)=>SourceScreen({})));
setState(() {
value =1;
API(value: value);
});
},
child:Text('India'),
color: Colors.blue,
),
FlatButton(
onPressed: (){
Navigator.push(context, MaterialPageRoute(builder: (context)=>SourceScreen({})));
setState(() {
value =0;
API(value: value);
});
},
child:Text('World'),
color: Colors.blue,
),
],
),
),
);
}
}
导入“包装:颤振/材料.省道”;
导入“sourceScreen.dart”;
导入“模型/API.dart”;
类Home扩展了StatefulWidget{
@凌驾
_HomeState createState()=>\u HomeState();
}
类(HomeState扩展状态){
int值=0;
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(标题:文本(“新闻”)),
正文:中(
子:列(
儿童:[
扁平按钮(
已按下:(){
push(context,MaterialPageRoute(builder:(context)=>SourceScreen({}));
设置状态(){
数值=1;
空气污染指数(数值:数值);;
});
},
child:Text('India'),
颜色:颜色,蓝色,
),
扁平按钮(
已按下:(){
push(context,MaterialPageRoute(builder:(context)=>SourceScreen({}));
设置状态(){
数值=0;
空气污染指数(数值:数值);;
});
},
子:文本(“世界”),
颜色:颜色,蓝色,
),
],
),
),
);
}
}
这是我的API页面,我想在下面给出的逻辑中使用这个值,希望你能理解-
import 'model.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';
class API{
int value;
API({this.value});
Future<List<Source>> fetchNewsSource() async {
final world ='https://newsapi.org/v2/sources?apiKey=';
final india = 'https://newsapi.org/v2/sources?language=en&country=in&apiKey=';
String result;
void logic(){
if(value==1){
result = india;
}
else if(value==0){
result = world;
}
}
final response = await http.get(result);
if (response.statusCode == 200) {
List sources = json.decode(response.body)['sources'];
return sources.map((source) => new Source.formJson(source)).toList();
} else {
throw Exception('Fail to load data');
}
}
}
导入“model.dart”;
将“package:http/http.dart”导入为http;
导入“dart:convert”;
类API{
int值;
API({this.value});
Future fetchNewsSource()异步{
最终世界杯https://newsapi.org/v2/sources?apiKey=';
最终印度https://newsapi.org/v2/sources?language=en&country=in&apiKey=';
字符串结果;
void逻辑(){
如果(值==1){
结果=印度;
}
else if(值==0){
结果=世界;
}
}
最终响应=等待http.get(结果);
如果(response.statusCode==200){
List sources=json.decode(response.body)['sources'];
返回sources.map((source)=>newsource.formJson(source)).toList();
}否则{
抛出异常(“加载数据失败”);
}
}
}
这里是主页-
import 'package:flutter/material.dart';
import 'sourceScreen.dart';
import 'models/API.dart';
class Home extends StatefulWidget {
@override
_HomeState createState() => _HomeState();
}
class _HomeState extends State<Home> {
int value=0;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title:Text("uTTerNews")),
body: Center(
child: Column(
children: <Widget>[
FlatButton(
onPressed: (){
Navigator.push(context, MaterialPageRoute(builder: (context)=>SourceScreen({})));
setState(() {
value =1;
API(value: value);
});
},
child:Text('India'),
color: Colors.blue,
),
FlatButton(
onPressed: (){
Navigator.push(context, MaterialPageRoute(builder: (context)=>SourceScreen({})));
setState(() {
value =0;
API(value: value);
});
},
child:Text('World'),
color: Colors.blue,
),
],
),
),
);
}
}
导入“包装:颤振/材料.省道”;
导入“sourceScreen.dart”;
导入“模型/API.dart”;
类Home扩展了StatefulWidget{
@凌驾
_HomeState createState()=>\u HomeState();
}
类(HomeState扩展状态){
int值=0;
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(标题:文本(“新闻”)),
正文:中(
子:列(
儿童:[
扁平按钮(
已按下:(){
push(context,MaterialPageRoute(builder:(context)=>SourceScreen({}));
设置状态(){
数值=1;
空气污染指数(数值:数值);;
});
},
child:Text('India'),
颜色:颜色,蓝色,
),
扁平按钮(
已按下:(){
push(context,MaterialPageRoute(builder:(context)=>SourceScreen({}));
设置状态(){
数值=0;
空气污染指数(数值:数值);;
});
},
子:文本(“世界”),
颜色:颜色,蓝色,
),
],
),
),
);
}
}
源屏幕
import 'package:flutter/material.dart';
import 'models/model.dart';
import 'models/card.dart';
import 'article.dart';
import 'models/API.dart';
class SourceScreen extends StatefulWidget {
SourceScreen(Map<int, int> map);
@override
_SourceScreenState createState() => _SourceScreenState();
}
class _SourceScreenState extends State<SourceScreen> {
var list_source;
var refreshKey = GlobalKey<RefreshIndicatorState>();
@override
void initState() {
super.initState();
refreshListSource();
}
Future<Null> refreshListSource() async {
API api = new API();
refreshKey.currentState?.show(atTop: false);
setState(() {
list_source = api.fetchNewsSource();
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
backgroundColor: Color.fromRGBO(58, 66, 86, 1.0),
appBar: AppBar(
elevation: 1.0,
backgroundColor: Color.fromRGBO(58, 66, 86, 1.0),
title: Text('uTTerNews'),
),
body: Center(
child: RefreshIndicator(
child: FutureBuilder<List<Source>>(
future: list_source,
builder: (context, snapshot) {
if (snapshot.hasError) {
Text('Error: ${snapshot.error}');
} else if (snapshot.hasData) {
List<Source> sources = snapshot.data;
return new ListView(
children: sources
.map((source) =>
GestureDetector(
onTap: () {
Navigator.push(context, MaterialPageRoute(
builder: (context) =>
articleScreen(source: source,)));
},
child: card(source),
))
.toList());
}
return CircularProgressIndicator();
},
),
onRefresh: refreshListSource),
),
),
);
}
}
导入“包装:颤振/材料.省道”;
导入“models/model.dart”;
导入“模型/卡片.省道”;
进口“article.dart”;
导入“模型/API.dart”;
类SourceScreen扩展了StatefulWidget{
源屏幕(地图);
@凌驾
_SourceScreenState createState()=>\u SourceScreenState();
}
类_SourceScreenState扩展状态{
风险值清单和来源;
var refreshKey=GlobalKey();
@凌驾
void initState(){
super.initState();
refreshListSource();
}
Future refreshListSource()异步{
API=新API();
refreshKey.currentState?显示(atTop:false);
设置状态(){
list_source=api.fetchNewsSource();
});
}
@凌驾
小部件构建(构建上下文){
返回材料PP(
家:脚手架(
背景颜色:颜色。来自RGBO(58,66,86,1.0),
appBar:appBar(
标高:1.0,
背景颜色:颜色。来自RGBO(58,66,86,1.0),
标题:文本(“新闻”),
),
正文:中(
子:刷新指示器(
孩子:未来建设者(
未来:列出来源,
生成器:(上下文,快照){
if(snapshot.hasError){
Text('Error:${snapshot.Error}');
}else if(snapshot.hasData){
列表源=snapshot.data;
返回新的ListView(
儿童:资料来源
.map((源)=>
手势检测器(
onTap:(){
Navigator.push(上下文、MaterialPage路由)(
生成器:(上下文)=>
articleScreen(来源:来源,);
},
子:卡(来源),
))
.toList());
}
返回循环ProgressIndicator();
},
),
onRefresh:refreshListSource),
),
),
);
}
}
输出:
请尝试以下完整代码:
void main() => runApp(MaterialApp(home: Home()));
class Home extends StatefulWidget {
@override
_HomeState createState() => _HomeState();
}
class _HomeState extends State<Home> {
int value = 0;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("uTTerNews")),
body: Center(
child: Column(
children: <Widget>[
FlatButton(
onPressed: () async {
value = 1;
List list = await API(value: value).fetchNewsSource();
Navigator.push(context, MaterialPageRoute(builder: (context) => SourceScreen(list)));
},
child: Text('India'),
color: Colors.blue,
),
FlatButton(
onPressed: () async {
value = 0;
List list = await API(value: value).fetchNewsSource();
Navigator.push(context, MaterialPageRoute(builder: (context) => SourceScreen(list)));
},
child: Text('World'),
color: Colors.blue,
),
],
),
),
);
}
}
class API {
int value;
API({@required this.value});
Future<List<dynamic>> fetchNewsSource() async {
final world = 'https://newsapi.org/v2/sources?apiKey=$apiKey';
final india = 'https://newsapi.org/v2/sources?language=en&country=in&apiKey=$apiKey';
String result;
if (value == 1)
result = india;
else if (value == 0) result = world;
final response = await http.get(result);
if (response.statusCode == 200) {
List sources = json.decode(response.body)['sources'];
return sources;
} else {
throw Exception('Fail to load data');
}
}
}
class SourceScreen extends StatefulWidget {
final List list;
SourceScreen(this.list);
@override
_SourceScreenState createState() => _SourceScreenState();
}
class _SourceScreenState extends State<SourceScreen> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("Channels")),
body: ListView(
children: widget.list.map((map) => ListTile(title: Text(map["name"]))).toList(),
),
);
}
}
void main()=>runApp(MaterialApp(home:home());
类Home扩展了StatefulWidget{
@凌驾
_HomeState createState()=>\u HomeState();
}
类(HomeState扩展状态){
int值=0;
@凌驾
小部件构建(Buil)