如何解决如何动态地按日期排序?
我正在开发一个待办事项列表应用程序,我想按日期对上传的任务进行排序(新任务首先出现)。为此,我认为应该为“待办事项”列表中的每个上传项目提供一个密钥,并且该密钥应包含一个“日期”。为了做到这一点,在React Native中,我向按日期排序的列表中的数据添加了一个功能,但是由于我不熟悉,所以我不知道该怎么做。任何想法都可以帮助:)
main.dart
List<String> _toDoItems = []; //this is the array in which the uploaded tasks are stored,btw Im not using any database.
TextEditingController _controller = TextEditingController();
void _addToDoItem(String task) {
if(task.length > 0) {
setState(() {
_toDoItems.add(task);
});
}
}
void _removeTodoItem(int index) {
setState(() => _toDoItems.removeAt(index));
}
Widget _buildToDoItem(String toDoText,int index) {
return SizedBox(
child: Container(
height: 58,margin: EdgeInsets.only(left: 22.0,right: 22.0,bottom: 12,),decoration: BoxDecoration(
border: Border.all(width: 1.5,color: Colors.red),borderRadius: BorderRadius.all(Radius.circular(18)),child: Row(
crossAxisAlignment: CrossAxisAlignment.center,children:[
Expanded(
child: ListTile(
title: Text(
toDoText,style: TextStyle(fontSize: 18),onTap: () => _removeTodoItem(index),FlatButton(
child: Text('Delete',style: TextStyle(color: Colors.red,fontSize: 16.5),onPressed: () => _removeTodoItem(index),],);
}
Widget _buildToDoList() {
return Expanded(
child: ListView.builder(
itemBuilder: (context,index) {
if (index < _toDoItems.length) {
return _buildToDoItem(_toDoItems[index],index);
}
},);
}
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: PreferredSize(
preferredSize: Size.fromHeight(50),child: AppBar(
centerTitle: true,backgroundColor: Colors.red,title: Text('To Do List',style: TextStyle(fontSize: 24,fontWeight: FontWeight.bold,)
),backgroundColor: Colors.white,body: Column(
crossAxisAlignment: CrossAxisAlignment.center,children: [
Container(
height: 60,margin: EdgeInsets.all(22),child: Row(
crossAxisAlignment: CrossAxisAlignment.center,children: [
Expanded(
flex: 10,child: Container(
height: double.infinity,child: TextField(
controller: _controller,autofocus: true,onSubmitted: (val) {
_addToDoItem(val);
_controller.clear();
},style: TextStyle(fontSize: 18,Expanded(
flex: 4,margin: EdgeInsets.only(left: 12),child: RaisedButton(
textColor: Colors.white,color: Colors.red,child: Text('ADD',style: TextStyle(fontSize: 18)),shape: RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(12)),onPressed: () {
_addToDoItem(_controller.text);
_controller.clear();
FocusScope.of(context).requestFocus(FocusNode());
},_buildToDoList()
]
),);
}
解决方法
您需要使用List的sort()
方法,还需要能够在创建任务时以某种方式进行库存。
我已经用您发布的代码作为示例。使用它,您最后创建的元素将始终是列表的第一个。
import 'package:flutter/material.dart';
class ToDoElement {
final String task;
final DateTime timeOfCreation;
ToDoElement(this.task,this.timeOfCreation);
}
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
createState() => _MyAppState();
}
class _MyAppState extends State {
TextEditingController _controller = TextEditingController();
List<ToDoElement> _toDoItems = [];
void _removeTodoItem(int index) {
setState(() => _toDoItems.removeAt(index));
}
void _addToDoItem(String task) {
if (task.isNotEmpty) {
setState(() => _toDoItems.add(ToDoElement(task,DateTime.now())));
}
}
Widget _buildToDoItem(String toDoText,int index) {
return SizedBox(
child: Container(
height: 58,margin: EdgeInsets.only(left: 22,right: 22,bottom: 12),decoration: BoxDecoration(
border: Border.all(width: 1.5,color: Colors.red),borderRadius: BorderRadius.all(Radius.circular(18)),),child: Row(
crossAxisAlignment: CrossAxisAlignment.center,children: [
Expanded(
child: ListTile(
title: Text(
toDoText,style: TextStyle(fontSize: 18),onTap: () => _removeTodoItem(index),FlatButton(
child: Text(
'Delete',style: TextStyle(color: Colors.red,fontSize: 16.5),onPressed: () => _removeTodoItem(index),],);
}
int compareElement(ToDoElement a,ToDoElement b) =>
a.timeOfCreation.isAfter(b.timeOfCreation) ? -1 : 1;
Widget _buildToDoList() {
_toDoItems.sort(compareElement);
return Expanded(
child: ListView.builder(
itemCount: _toDoItems.length,itemBuilder: (context,index) {
return _buildToDoItem(_toDoItems[index].task,index);
},);
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: PreferredSize(
preferredSize: Size.fromHeight(50),child: AppBar(
centerTitle: true,backgroundColor: Colors.red,title: Text(
'To Do List',style: TextStyle(
fontSize: 24,fontWeight: FontWeight.bold,)),backgroundColor: Colors.white,body: Column(crossAxisAlignment: CrossAxisAlignment.center,children: [
Container(
height: 60,margin: EdgeInsets.all(22),child: Row(
crossAxisAlignment: CrossAxisAlignment.center,children: [
Expanded(
flex: 10,child: Container(
height: double.infinity,child: TextField(
controller: _controller,autofocus: true,onSubmitted: (val) {
_addToDoItem(val);
_controller.clear();
},style: TextStyle(
fontSize: 18,Expanded(
flex: 4,margin: EdgeInsets.only(left: 12),child: RaisedButton(
textColor: Colors.white,color: Colors.red,child: Text('ADD',style: TextStyle(fontSize: 18)),shape: RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(12)),onPressed: () {
_addToDoItem(_controller.text);
_controller.clear();
FocusScope.of(context).requestFocus(FocusNode());
},_buildToDoList()
]),);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。