Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter Can';无法从api获取数据_Flutter - Fatal编程技术网

Flutter Can';无法从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();

当我在应用逻辑后在API页面中从主页传递值时,我并没有在结果变量中获取数据。我做错了什么

这是我的主页,我在这里传递值-

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)