我在Flutter的项目管理应用中使用了一个ListView.builder。这个ListView填充了任务列表(包括:新的、进行中的和已完成的)。我从API获取这些数据并希望“新建”的任务显示在顶部,“进行中”的任务位于中部,“已完成”的任务在底部!- 这是当前的情况 这是我的类,请注意我从API / JSON获取状态。
class ProjectTask {
final int id;
final String description;
final String state;
final List assigned_users;
final List subtasks;
ProjectTask(this.id,
this.description,
this.state,
this.assigned_users,
this.subtasks);
}
The ListView
else return ListView.builder(
itemCount: snapshot.data.length,
itemBuilder: (BuildContext context, int index) {
if(snapshot.data[index].state == "done") {
return Slidable(
//SLIDABLE STUFF
delegate: SlidableStrechDelegate(),
actionExtentRatio: 0.25,
actions: <Widget>[
//ACTION ONE
IconSlideAction(
caption: ("Information"),
foregroundColor: Colors.white,
color: Colors.black38,
icon: Icons.info,
onTap: () {
Navigator.push(context, MaterialPageRoute(builder: (context)=>projectTask(snapshot.data[index])));
},
),
],
child: ListTile(
onTap: () {
Navigator.push(context, MaterialPageRoute(builder: (context) => projectTask(
snapshot.data[index],
)));
},
title: Text("${snapshot.data[index].description[0].toString().toUpperCase()}"
"${snapshot.data[index].description.toString().substring(1)}", maxLines: 1, style: TextStyle(
color: Colors.black87, fontSize: 17)
),
subtitle: Text("done"),
leading: Icon(Icons.check_circle, color: Colors.green),
trailing: Icon(Icons.arrow_right, color: Colors.black54,),
),
);
}
else if(snapshot.data[index].state == "started") {
return Slidable(
//SLIDABLE STUFF
delegate: SlidableStrechDelegate(),
actionExtentRatio: 0.25,
actions: <Widget>[
//ACTION ONE
IconSlideAction(
caption: ("Information"),
foregroundColor: Colors.white,
color: Colors.black38,
icon: Icons.info,
onTap: () {
Navigator.push(context, MaterialPageRoute(builder: (context)=>projectTask(snapshot.data[index])));
},
),
],
secondaryActions: <Widget>[
//ACTION TWO
IconSlideAction(
caption: ("Complete Me"),
color: Colors.green,
icon: Icons.radio_button_checked,
onTap: () {
Navigator.push(context, MaterialPageRoute(builder: (context)=>projectTask(snapshot.data[index])));
},
)
],
child: ListTile(
onTap: () {
Navigator.push(context, MaterialPageRoute(builder: (context) => projectTask(
snapshot.data[index],
)));
},
title: Text("${snapshot.data[index].description[0].toString().toUpperCase()}"
"${snapshot.data[index].description.toString().substring(1)}", maxLines: 1, style: TextStyle(
color: Colors.black87, fontSize: 17)
),
subtitle: Text("working"),
leading: Icon(Icons.radio_button_checked, color: Colors.blue),
trailing: Icon(Icons.arrow_right, color: Colors.black54,),
),
);
}
else {
return Slidable(
//SLIDABLE STUFF
delegate: SlidableStrechDelegate(),
actionExtentRatio: 0.25,
actions: <Widget>[
//ACTION ONE
IconSlideAction(
caption: ("Information"),
foregroundColor: Colors.white,
color: Colors.black38,
icon: Icons.info,
onTap: () {
Navigator.push(context, MaterialPageRoute(builder: (context)=>projectTask(snapshot.data[index])));
},
),
],
secondaryActions: <Widget>[
//ACTION TWO
IconSlideAction(
caption: ("Start Work"),
color: Colors.blue,
icon: Icons.radio_button_checked,
onTap: () {
Navigator.push(context, MaterialPageRoute(builder: (context)=>projectTask(snapshot.data[index])));
},
)
],
//LISTTILE
child: ListTile(
onTap: () {
Navigator.push(context, MaterialPageRoute(builder: (context) => projectTask(
snapshot.data[index],
)));
},
title: Text("${snapshot.data[index].description[0].toString().toUpperCase()}"
"${snapshot.data[index].description.toString().substring(1)}", maxLines: 1, style: TextStyle(
color: Colors.black87, fontSize: 17)
),
subtitle: Text("new"),
leading: Icon(Icons.radio_button_checked, color: Colors.red),
trailing: Icon(Icons.arrow_right, color: Colors.black54,),
),
);
}
}
);
JSON
[
{
"id": 7,
"description": "Finishedddddd",
"state": "done",
"assigned_users": [
{
"username": "hugo",
"fullname": "Hugo Johnsson"
}
],
"subtasks": []
},
{
"id": 9,
"description": "Newwww task for Huuugo",
"state": "started",
"assigned_users": [
{
"username": "hugo",
"fullname": "Hugo Johnsson"
}
],
"subtasks": []
},
{
"id": 11,
"description": "Google presentation om IKEAS ekonomi",
"state": "done",
"assigned_users": [
{
"username": "studentone",
"fullname": "Student One"
}
],
"subtasks": []
},
{
"id": 15,
"description": "entail",
"state": "new",
"assigned_users": [],
"subtasks": [
{
"id": 1,
"description": "dasdasdasd"
},
{
"id": 2,
"description": "fsdfsdfsdf"
}
]
},
{
"id": 17,
"description": "gmmgmsgd",
"state": "new",
"assigned_users": [],
"subtasks": []
},
{
"id": 18,
"description": "dasd",
"state": "started",
"assigned_users": [],
"subtasks": []
},
{
"id": 19,
"description": "fsdfdsfsd",
"state": "started",
"assigned_users": [],
"subtasks": []
},
{
"id": 20,
"description": "Werner",
"state": "new",
"assigned_users": [],
"subtasks": []
},
{
"id": 21,
"description": "teadfsd",
"state": "done",
"assigned_users": [],
"subtasks": []
},
{
"id": 22,
"description": "task",
"state": "new",
"assigned_users": [],
"subtasks": []
},
{
"id": 23,
"description": "asdasd",
"state": "started",
"assigned_users": [],
"subtasks": []
},
{
"id": 24,
"description": "asdasd",
"state": "new",
"assigned_users": [
{
"username": "hugo",
"fullname": "Hugo Johnsson"
}
],
"subtasks": []
}
]