Flutter 如何正确地从未来返回一个列表,以便在Flatter中的ListView.Builder中使用?

Flutter 如何正确地从未来返回一个列表,以便在Flatter中的ListView.Builder中使用?,flutter,Flutter,我希望从未来获得一个列表,并在ListView.Builder中使用此列表。唯一的问题是,我显然正在找到一个很好的方法来实现这一点。如果有人能给我一些建议,这里有一些代码片段。谢谢 在这里,我调用了数据的函数以及ListView.Builder class _ChangeQuarterState extends State<ChangeQuarter> { static const Color greycolor = Color.fromRGBO(220, 220, 220, 1

我希望从未来获得一个列表,并在ListView.Builder中使用此列表。唯一的问题是,我显然正在找到一个很好的方法来实现这一点。如果有人能给我一些建议,这里有一些代码片段。谢谢

在这里,我调用了数据的函数以及ListView.Builder

class _ChangeQuarterState extends State<ChangeQuarter> {
  static const Color greycolor = Color.fromRGBO(220, 220, 220, 10);


 Future<List<Quarter>> quarters = getQuarters();


  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.grey[200],
      appBar: PreferredSize(
        preferredSize: Size.fromHeight(95.0),
        child: AppBar(
          automaticallyImplyLeading: false, // hides leading widget
          flexibleSpace: QuarterAppBar(),
        ),
      ),
      body: Container(
        child: ListView.builder(
          itemCount: quarters[index],
          shrinkWrap: true,
          itemBuilder: (context, index) {
            return Padding(
              padding: EdgeInsets.symmetric(vertical: 1.0, horizontal: 4.0),
              child: Card(
                color: (index % 2 == 0) ? greycolor : Colors.white,
                child: Container(
                    height: 60,
                    padding: EdgeInsets.fromLTRB(0, 20, 0, 0),
                    child: InkWell(
                      onTap: () => Navigator.pop(context),
                      child: Row(
                      mainAxisAlignment: MainAxisAlignment.center,
                      children: <Widget>[
                        Container(
                          margin: EdgeInsets.only(right: 5),
                          child: Text(quarters[index].quarter,
                              style: TextStyle(
                                  fontSize: 20,
                                  fontFamily: 'Montserrat',
                                  color: BBFILightBlue),
                              textAlign: TextAlign.left),
                        ),
class\u ChangeQuarterState扩展状态{
静态常量Color greycolor=Color.fromRGBO(220,220,220,10);
未来季度=获取季度();
@凌驾
小部件构建(构建上下文){
返回脚手架(
背景颜色:颜色。灰色[200],
appBar:首选大小(
首选尺寸:尺寸。从高度(95.0),
孩子:AppBar(
automaticallyImplyLeading:false,//隐藏前导小部件
flexibleSpace:QuarterAppBar(),
),
),
主体:容器(
子项:ListView.builder(
项目计数:季度[索引],
收缩膜:对,
itemBuilder:(上下文,索引){
返回填充(
填充:边缘设置。对称(垂直:1.0,水平:4.0),
孩子:卡片(
颜色:(索引%2==0)?灰色:Colors.white,
子:容器(
身高:60,
填充:来自LTRB(0,20,0,0)的边插入集,
孩子:InkWell(
onTap:()=>Navigator.pop(上下文),
孩子:排(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
容器(
页边距:仅限边集(右:5),
子项:文本(季度[索引])。季度,
样式:TextStyle(
尺寸:20,
fontFamily:“蒙特塞拉特”,
颜色:BBFILightBlue),
textAlign:textAlign.left),
),
在那里我得到了我想变成一个列表的建设者的数据

Future<Quarter> getQuarters() async {
  final http.Response response = await http.get(
    'https://fakedapi.com/getQuarters',
    headers: <String, String>{
      'Authorization': 'topsecret',
    },
  );
  if (response.statusCode <400) {
    return  Quarter.fromJson(json.decode(response.body));


  } else {
    throw Exception('Failed to get quarters');
  }
}
Future getQuarters()异步{
final http.Response Response=wait http.get(
'https://fakedapi.com/getQuarters',
标题:{
“授权”:“最高机密”,
},
);

如果(response.statusCode您可以复制粘贴运行下面的完整代码
您可以使用
FutureBuilder
并操作
snapshot.data

代码片段

Future<List<Quarter>> _future;

@override
  initState() {
    _future = getQuarters();
  }


FutureBuilder(
            future: _future,
            builder: (context, AsyncSnapshot<List<Quarter>> snapshot) {
              switch (snapshot.connectionState) {
                ...
                  } else {
                    return ListView.builder(
                        itemCount: snapshot.data.length,
                        shrinkWrap: true,
                        ...
                                  child: Text(
                                      snapshot
                                          .data[index].quarter,
Future\u Future;
@凌驾
initState(){
_future=getQuarters();
}
未来建设者(
未来:未来,
生成器:(上下文,异步快照){
交换机(快照.连接状态){
...
}否则{
返回ListView.builder(
itemCount:snapshot.data.length,
收缩膜:对,
...
子:文本(
快照
.数据[索引]。季度,
工作演示

完整代码

import 'package:flutter/material.dart';
import 'dart:convert';
import 'package:http/http.dart' as http;

List<Quarter> quarterFromJson(String str) =>
    List<Quarter>.from(json.decode(str).map((x) => Quarter.fromJson(x)));

String quarterToJson(List<Quarter> data) =>
    json.encode(List<dynamic>.from(data.map((x) => x.toJson())));

class Quarter {
  Quarter({
    this.quarter,
  });

  String quarter;

  factory Quarter.fromJson(Map<String, dynamic> json) => Quarter(
        quarter: json["quarter"],
      );

  Map<String, dynamic> toJson() => {
        "quarter": quarter,
      };
}

class ChangeQuarter extends StatefulWidget {
  @override
  _ChangeQuarterState createState() => _ChangeQuarterState();
}

class _ChangeQuarterState extends State<ChangeQuarter> {
  static const Color greycolor = Color.fromRGBO(220, 220, 220, 10);
  Future<List<Quarter>> _future;

  Future<List<Quarter>> getQuarters() async {
    /*final http.Response response = await http.get(
      'https://fakedapi.com/getQuarters',
      headers: <String, String>{
        'Authorization': 'topsecret',
      },
    );*/
    String jsonString = '''
    [{
    "quarter" : "1"
},
{
    "quarter" : "2"
},
{
    "quarter" : "3"
},
{
    "quarter" : "4"
}
]
    ''';
    final http.Response response = http.Response(jsonString, 200);

    if (response.statusCode < 400) {
      return quarterFromJson(
          response.body); //Quarter.fromJson(json.decode(response.body));

    } else {
      throw Exception('Failed to get quarters');
    }
  }

  @override
  initState() {
    _future = getQuarters();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        backgroundColor: Colors.grey[200],
        appBar: PreferredSize(
          preferredSize: Size.fromHeight(95.0),
          child: AppBar(
            automaticallyImplyLeading: false, // hides leading widget
            //flexibleSpace: QuarterAppBar(),
          ),
        ),
        body: FutureBuilder(
            future: _future,
            builder: (context, AsyncSnapshot<List<Quarter>> snapshot) {
              switch (snapshot.connectionState) {
                case ConnectionState.none:
                  return Text('none');
                case ConnectionState.waiting:
                  return Center(child: CircularProgressIndicator());
                case ConnectionState.active:
                  return Text('');
                case ConnectionState.done:
                  if (snapshot.hasError) {
                    return Text(
                      '${snapshot.error}',
                      style: TextStyle(color: Colors.red),
                    );
                  } else {
                    return ListView.builder(
                        itemCount: snapshot.data.length,
                        shrinkWrap: true,
                        itemBuilder: (context, index) {
                          return Padding(
                              padding: EdgeInsets.symmetric(
                                  vertical: 1.0, horizontal: 4.0),
                              child: Card(
                                  color: (index % 2 == 0)
                                      ? greycolor
                                      : Colors.white,
                                  child: Container(
                                      height: 60,
                                      padding: EdgeInsets.fromLTRB(0, 20, 0, 0),
                                      child: InkWell(
                                          onTap: () => Navigator.pop(context),
                                          child: Row(
                                              mainAxisAlignment:
                                                  MainAxisAlignment.center,
                                              children: <Widget>[
                                                Container(
                                                  margin:
                                                      EdgeInsets.only(right: 5),
                                                  child: Text(
                                                      snapshot
                                                          .data[index].quarter,
                                                      style: TextStyle(
                                                          fontSize: 20,
                                                          fontFamily:
                                                              'Montserrat',
                                                          color: Colors.blue),
                                                      textAlign:
                                                          TextAlign.left),
                                                )
                                              ])))));
                        });
                  }
              }
            }));
  }
}

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: ChangeQuarter(),
    );
  }
}
导入“包装:颤振/材料.省道”;
导入“dart:convert”;
将“package:http/http.dart”导入为http;
List quarterFromJson(字符串str)=>
List.from(json.decode(str.map)(x)=>Quarter.fromJson(x));
字符串quarteToJSON(列表数据)=>
encode(List.from(data.map((x)=>x.toJson());
班级宿舍{
四分之一({
这个季度,
});
弦四分之一;
factory Quarter.fromJson(映射json)=>Quarter(
季度:json[“季度”],
);
映射到JSON()=>{
“季度”:季度,
};
}
类ChangeQuarter扩展StatefulWidget{
@凌驾
_ChangeQuarterState createState()=>\u ChangeQuarterState();
}
类_ChangeQuarterState扩展状态{
静态常量Color greycolor=Color.fromRGBO(220,220,220,10);
未来,未来;;
Future getQuarters()异步{
/*final http.Response Response=wait http.get(
'https://fakedapi.com/getQuarters',
标题:{
“授权”:“最高机密”,
},
);*/
字符串jsonString='''
[{
“季度”:“1”
},
{
“季度”:“2”
},
{
“季度”:“3”
},
{
“季度”:“4”
}
]
''';
最终的http.Response=http.Response(jsonString,200);
如果(response.statusCode<400){
从JSON返回四分之一(
response.body);//Quarter.fromJson(json.decode(response.body));
}否则{
抛出异常('未能获取四分之一');
}
}
@凌驾
initState(){
_future=getQuarters();
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
背景颜色:颜色。灰色[200],
appBar:首选大小(
首选尺寸:尺寸。从高度(95.0),
孩子:AppBar(
automaticallyImplyLeading:false,//隐藏前导小部件
//flexibleSpace:QuarterAppBar(),
),
),
正文:未来建设者(
未来:未来,
生成器:(上下文,异步快照){
交换机(快照.连接状态){
案例连接状态。无:
返回文本(“无”);
案例连接状态。正在等待:
返回中心(子项:CircularProgressIndicator());
案例连接状态.active:
返回文本(“”);
案例连接状态。完成:
if(snapshot.hasError){
返回文本(
“${snapshot.error}”,
样式:TextStyle(颜色:Colors.red),
);
}否则{
返回ListView.builder(
itemCount:snapshot.data.length,
收缩膜:对,
itemBuilder:(上下文,索引){
返回填充(
填充:EdgeInsets.symmetric(