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