Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.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 如何使用GridView从服务器中放入JSON数据——flatter_Flutter_Dart - Fatal编程技术网

Flutter 如何使用GridView从服务器中放入JSON数据——flatter

Flutter 如何使用GridView从服务器中放入JSON数据——flatter,flutter,dart,Flutter,Dart,我参考了食谱 示例代码用于获取单个JSON数据 我试图从StatefulWidget获取以下多个JSON数据。 我想通过GridView显示每个网格中的季节数据 [ {"id":1,"season_end":"1999/01","season_name":"First","season_start":"1999/08"}, {"id":2,"season_end":"1999/07","season_name":"Second","season_start":"1999/02"},

我参考了食谱

示例代码用于获取单个JSON数据

我试图从StatefulWidget获取以下多个JSON数据。 我想通过GridView显示每个网格中的季节数据

[
  {"id":1,"season_end":"1999/01","season_name":"First","season_start":"1999/08"}, 
  {"id":2,"season_end":"1999/07","season_name":"Second","season_start":"1999/02"}, 
  {"id":3,"season_end":"2000/01","season_name":"Third","season_start":"1999/08"}, 
  {"id":4,"season_end":"2000/07","season_name":"Forth","season_start":"2000/02"}
]
然而,我不知道如何编写更好的代码,如下所示

class _HomePageState extends State<HomePage> {
  Future<List<Season>> seasons;

  @override
  void initState(){
    super.initState();
    seasons = fetchSeasons();
  }

  Widget build(BuildContext context) {
    return Scaffold(
      body: GridView.builder(
          gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
            ...
          ),
          itemBuilder: (context, index){
            return seasons[index].toString();
          }
      )
    )
  }
}

有两种方法可以做到这一点,您可以这样做,在这种情况下,您不需要使用initstate或有状态小部件futurebuilder在屏幕上呈现时自动调用方法fetchSeasons,结果作为快照接收,可以如下访问

FutureBuilder<List<seasons>>(
future:fetchSeasons(),
builder:(BuildContext context,AsyncSnapshot <List<seasons>>snapshot){
          snapshot.hasData?
          return GridView.builder(
          gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
            ...
          ),
          itemCount:snapshot.data.length,
          itemBuilder: (context, index){
            return Column(
             children: <Widget>[
                    Text('${snapshot.data[index]['id']}'),
                    Text('${snapshot.data[index]['season_name']}'),
                    Text('${snapshot.data[index]['season_end']}'),
                    Text('${snapshot.data[index]['season_start']}'),
                ]
               ):Center(child:CircularProgressIndicator());
          }
});

有两种方法可以做到这一点,您可以这样做,在这种情况下,您不需要使用initstate或有状态小部件futurebuilder在屏幕上呈现时自动调用方法fetchSeasons,结果作为快照接收,可以如下访问

FutureBuilder<List<seasons>>(
future:fetchSeasons(),
builder:(BuildContext context,AsyncSnapshot <List<seasons>>snapshot){
          snapshot.hasData?
          return GridView.builder(
          gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
            ...
          ),
          itemCount:snapshot.data.length,
          itemBuilder: (context, index){
            return Column(
             children: <Widget>[
                    Text('${snapshot.data[index]['id']}'),
                    Text('${snapshot.data[index]['season_name']}'),
                    Text('${snapshot.data[index]['season_end']}'),
                    Text('${snapshot.data[index]['season_start']}'),
                ]
               ):Center(child:CircularProgressIndicator());
          }
});
问题是季节是一个未来,而不是一个列表,这就是为什么你不能像列表一样使用它

如果要访问该未来的列表,需要使用FutureBuilder,如下所示:

Widget build(BuildContext context) {
  return Scaffold(
    body: FutureBuilder<List<Season>>(
      future: seasons,
      builder: (context, snapshot) {
        if (snapshot.hasData) {
          return GridView.builder(
              itemCount: snapshot.data.length,
              gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
              ...
              ),
              itemBuilder: (context, index) {
                return Text("${snapshot.data[index].season_name}");
              }
          );
        } else if (snapshot.hasError) {
          return Text("Error");
        }
        return Text("Loading...");
      },
    ),
  );
}
问题是季节是一个未来,而不是一个列表,这就是为什么你不能像列表一样使用它

如果要访问该未来的列表,需要使用FutureBuilder,如下所示:

Widget build(BuildContext context) {
  return Scaffold(
    body: FutureBuilder<List<Season>>(
      future: seasons,
      builder: (context, snapshot) {
        if (snapshot.hasData) {
          return GridView.builder(
              itemCount: snapshot.data.length,
              gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
              ...
              ),
              itemBuilder: (context, index) {
                return Text("${snapshot.data[index].season_name}");
              }
          );
        } else if (snapshot.hasError) {
          return Text("Error");
        }
        return Text("Loading...");
      },
    ),
  );
}

我不明白为什么网格的数量超过4个?它返回更多的网格,并且没有index.Ops。我忘了设置项目计数。抱歉。文本“${snapshot.data[index]['seasure_name']}”有错误。未为班级季节定义运算符[]。实际上是这样的。所以基本上看来fetchSeasons没有返回列表。我不明白为什么网格的数量超过4?它返回更多的网格,并且没有index.Ops。我忘了设置项目计数。抱歉。文本“${snapshot.data[index]['seasure_name']}”有错误。未为班级季节定义运算符[]。实际上是这样的,所以基本上fetchSeasons并没有返回一个列表